]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
raw: check numeric user inputs
authorSami Kerola <kerolasa@iki.fi>
Sat, 17 Mar 2012 19:27:43 +0000 (20:27 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 30 Mar 2012 14:48:12 +0000 (16:48 +0200)
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
disk-utils/raw.c

index 2766bcef56b806ec398b58524af148d0b3774cd2..8844bc264e14b823287a164b46351ac224e15e46 100644 (file)
@@ -65,6 +65,29 @@ static void __attribute__ ((__noreturn__)) usage(int err)
 }
 
 
+long strtol_octal_or_err(const char *str, const char *errmesg)
+{
+       long num;
+       char *end = NULL;
+
+       if (str == NULL || *str == '\0')
+               goto err;
+       errno = 0;
+       num = strtol(str, &end, 0);
+
+       if (errno || str == end || (end && *end))
+               goto err;
+
+       return num;
+ err:
+       if (errno)
+               err(EXIT_FAILURE, "%s: '%s'", errmesg, str);
+       else
+               errx(EXIT_FAILURE, "%s: '%s'", errmesg, str);
+       return 0;
+}
+
+
 int main(int argc, char *argv[])
 {
        int  c;
@@ -168,8 +191,12 @@ int main(int argc, char *argv[])
                break;
 
        case 2:
-               block_major = strtol(argv[optind], 0, 0);
-               block_minor = strtol(argv[optind+1], 0, 0);
+               block_major =
+                   strtol_octal_or_err(argv[optind],
+                                       _("failed to parse argument"));
+               block_minor =
+                   strtol_octal_or_err(argv[optind + 1],
+                                       _("failed to parse argument"));
                break;
 
        default: