i386/143389: fdisk(8) cannot handle above 1TB under i386 system.
Daisuke Aoyama
aoyama at peach.ne.jp
Sun Jan 31 01:40:08 UTC 2010
>Number: 143389
>Category: i386
>Synopsis: fdisk(8) cannot handle above 1TB under i386 system.
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-i386
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Jan 31 01:40:08 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Daisuke Aoyama
>Release: FreeBSD 7.1-RELEASE-p10 i386
>Organization:
>Environment:
System: FreeBSD hera.peach.ne.jp.private 7.1-RELEASE-p10 FreeBSD 7.1-RELEASE-p10 #0: Wed Jan 13 13:18:46 JST 2010 aoyama at hera.peach.ne.jp.private:/usr/src/sys/i386/compile/ISCSI i386
>Description:
I first noticed at the post of FreeNAS forum below.
http://sourceforge.net/apps/phpbb/freenas/viewtopic.php?f=78&t=5558&start=0
The reason is /sbin/fdisk reads config value by strtol(3) as signed long which is 32 bits on i386.
At least, this bug still exists in HEAD.
structure definition:
>How-To-Repeat:
/sbin/fdisk -f <above config> on 2TB disk.
>Fix:
use unsigned long/int or more wide type.
(strtoul, etc)
>Release-Note:
>Audit-Trail:
>Unformatted:
>>typedef struct cmd {
>> char cmd;
>> int n_args;
>> struct arg {
>> char argtype;
>> int arg_val; //signed int (32bit)
>> } args[MAX_ARGS];
>>} CMD;
in function parse_config_line():
>> command->args[command->n_args].arg_val = strtol(cp, &end, 0); // return as signed long
strtol(3) is overflow if the value > LONG_MAX(0x7fffffffL on i386).
As a result, the partition have wrong size and boundary.
Once wrong partition is created, writing to it will cause data loss of next/previous partition.
I tested following config on 2TB disk.
g c261083 h255 s63
p 1 165 1 2097152
p 2 165 2097154 4175429632
p 3 165 4177526787 16777216
p 4 0 0 0
a 1
Please see above the link for more detail.
I am not checking other utilities.
More information about the freebsd-i386
mailing list