The following reply was made to PR bin/143389; it has been noted by GNATS.
From: Mark Johnston <[email protected]>
To: "[email protected]" <[email protected]>,
"[email protected]" <[email protected]>
Cc:
Subject: Re: bin/143389: [2tb] fdisk(8) cannot handle above 1TB under i386
system.
Date: Tue, 26 Oct 2010 18:43:42 +0000
I was about to submit a PR about this before I found this one.
The problem is that fdisk is using a signed integer to store slice
sizes, so attempts to create a slice of size >1TB will result in
fdisk using LONG_MAX as the slice size...which ends up corresponding
to 1TB on platforms where sizeof(long) =3D=3D 4.
The solution is to use an unsigned long instead.
We have a patch in our tree for it.
Thanks,
-Mark
diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c
index 0b2ce7d..89b35f9 100644
--- a/sbin/fdisk/fdisk.c
+++ b/sbin/fdisk/fdisk.c
@@ -105,9 +105,9 @@ typedef struct cmd {
char cmd;
int n_args;
struct arg {
- char argtype;
- int arg_val;
- char *arg_str;
+ char argtype;
+ unsigned long arg_val;
+ char *arg_str;
} args[MAX_ARGS];
} CMD;
=20
@@ -979,7 +979,7 @@ parse_config_line(char *line, CMD *command)
if (isalpha(*cp))
command->args[command->n_args].argtype =3D *cp++;
end =3D NULL;
- command->args[command->n_args].arg_val =3D strtol(cp, &end, 0);
+ command->args[command->n_args].arg_val =3D strtoul(cp, &end, 0)=
;
if (cp =3D=3D end || (!isspace(*end) && *end !=3D '\0')) {
char ch;
end =3D cp;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"