From 5267a520bb7887b146f05ffa8726664afbb6c3c2 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Mon, 4 Jun 2007 01:49:51 -0400 Subject: [PATCH] Fix error checking of badblock's last-block and start-block arguments Addresses Debian Bug: #416477 Signed-off-by: "Theodore Ts'o" --- misc/ChangeLog | 5 +++++ misc/badblocks.c | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/misc/ChangeLog b/misc/ChangeLog index 0923f94..5b680c5 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 8f48c88..88c5a74 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); } -- 1.8.3.1