From: Theodore Ts'o Date: Mon, 4 Jun 2007 05:49:51 +0000 (-0400) Subject: Fix error checking of badblock's last-block and start-block arguments X-Git-Tag: E2FSPROGS-1_40~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5267a520bb7887b146f05ffa8726664afbb6c3c2;p=thirdparty%2Fe2fsprogs.git Fix error checking of badblock's last-block and start-block arguments Addresses Debian Bug: #416477 Signed-off-by: "Theodore Ts'o" --- diff --git a/misc/ChangeLog b/misc/ChangeLog index 0923f9445..5b680c5f9 100644 --- a/misc/ChangeLog +++ b/misc/ChangeLog @@ -1,3 +1,8 @@ +2007-06-04 Theodore Tso + + * badblocks.c (main): Fix error checking of the last-block and + start-block arguments. (Addresses Debian Bug: #416477) + 2007-05-31 Theodore Tso * mke2fs.c (parse_extended_opts): Free allocated buf on return diff --git a/misc/badblocks.c b/misc/badblocks.c index 8f48c88bd..88c5a745d 100644 --- a/misc/badblocks.c +++ b/misc/badblocks.c @@ -46,6 +46,7 @@ extern int optind; #include #include #include +#include #include #include @@ -987,24 +988,31 @@ int main (int argc, char ** argv) exit(1); } } else { - last_block = strtoul (argv[optind], &tmp, 0) + 1; - if (*tmp) { + errno = 0; + last_block = strtoul (argv[optind], &tmp, 0); + printf("last_block = %d (%s)\n", last_block, argv[optind]); + if (*tmp || errno || + (last_block == ULONG_MAX && errno == ERANGE)) { com_err (program_name, 0, _("invalid blocks count - %s"), argv[optind]); exit (1); } + last_block++; optind++; } if (optind <= argc-1) { + errno = 0; from_count = strtoul (argv[optind], &tmp, 0); - if (*tmp) { + printf("from_count = %d\n", from_count); + if (*tmp || errno || + (from_count == ULONG_MAX && errno == ERANGE)) { com_err (program_name, 0, _("invalid starting block - %s"), argv[optind]); exit (1); } } else from_count = 0; if (from_count >= last_block) { - com_err (program_name, 0, _("invalid blocks range: %lu-%lu"), + com_err (program_name, 0, _("invalid starting block (%d): must be less than %lu"), (unsigned long) from_count, (unsigned long) last_block); exit (1); }