diff options
author | rstone <rstone@FreeBSD.org> | 2011-07-17 21:08:16 +0000 |
---|---|---|
committer | rstone <rstone@FreeBSD.org> | 2011-07-17 21:08:16 +0000 |
commit | cecff2d26e805364b921c7eb9189e52e6ea24cb1 (patch) | |
tree | c1563296e7eade8c79bf963d28607497d221b28d | |
parent | c55f34f6d6edc7a75ee7ec67521b8d711ac60503 (diff) | |
download | FreeBSD-src-cecff2d26e805364b921c7eb9189e52e6ea24cb1.zip FreeBSD-src-cecff2d26e805364b921c7eb9189e52e6ea24cb1.tar.gz |
The MBR uses a 32-bit unsigned integer to store the size of a slice, but
fdisk(1) internally uses a signed int. Should a user attempt to specify
a slice containing more than 2^31 - 1 sectors, an error will be reported
on systems with sizeof(long) == 4 and the slice size will be silently
truncated on systems with sizeof(long) > 4.
Instead use an unsigned long to store the slice size in fdisk(1). This
allows the user to specify a slice size up to the maximum permitted by
the MBR on-disk format and does not have any problems with silent
truncation should the use specify an slice size larger than 2^32 on systems
with sizeof(long) > 4.
Submitted by: Mark Johnston (markjdb AT gmail DOT com)
MFC after: 2 weeks
-rw-r--r-- | sbin/fdisk/fdisk.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sbin/fdisk/fdisk.c b/sbin/fdisk/fdisk.c index 8314906..eb81e3b 100644 --- a/sbin/fdisk/fdisk.c +++ b/sbin/fdisk/fdisk.c @@ -108,9 +108,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; @@ -990,7 +990,7 @@ parse_config_line(char *line, CMD *command) if (isalpha(*cp)) command->args[command->n_args].argtype = *cp++; end = NULL; - command->args[command->n_args].arg_val = strtol(cp, &end, 0); + command->args[command->n_args].arg_val = strtoul(cp, &end, 0); if (cp == end || (!isspace(*end) && *end != '\0')) { char ch; end = cp; |