]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
init: reduce PARTUUID min length to 1 from 36
authorStephen Warren <swarren@nvidia.com>
Fri, 12 Oct 2012 04:22:53 +0000 (15:22 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 16 Oct 2012 02:47:59 +0000 (13:47 +1100)
Reduce the minimum length for a root=PARTUUID= parameter to be considered
valid from 36 to 1.  EFI/GPT partition UUIDs are always exactly 36
characters long, hence the previous limit.  However, the next patch will
support DOS/MBR UUIDs too, which have a different, shorter, format.
Instead of validating any particular length, just ensure that at least
some non-empty value was given by the user.

Also, consider a missing UUID value to be a parsing error, in the same
vein as if /PARTNROFF exists and can't be parsed.  As such, make both
error cases print a message and disable rootwait.  Convert to pr_err while
we're at it.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Tejun Heo <tj@kernel.org>
Cc: Will Drewry <wad@chromium.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
init/do_mounts.c

index b28ec58193252fc5d7a4d522a04f7825b692bf78..c950d7c93f987af861cf2cf1f9dcf67dc9401a6f 100644 (file)
@@ -119,27 +119,29 @@ static dev_t devt_from_partuuid(const char *uuid_str)
        struct gendisk *disk;
        struct hd_struct *part;
        int offset = 0;
-
-       if (strlen(uuid_str) < 36)
-               goto done;
+       bool clear_root_wait = false;
+       char *slash;
 
        cmp.uuid = uuid_str;
-       cmp.len = 36;
 
+       slash = strchr(uuid_str, '/');
        /* Check for optional partition number offset attributes. */
-       if (uuid_str[36]) {
+       if (slash) {
                char c = 0;
                /* Explicitly fail on poor PARTUUID syntax. */
-               if (sscanf(&uuid_str[36],
-                          "/PARTNROFF=%d%c", &offset, &c) != 1) {
-                       printk(KERN_ERR "VFS: PARTUUID= is invalid.\n"
-                        "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
-                       if (root_wait)
-                               printk(KERN_ERR
-                                    "Disabling rootwait; root= is invalid.\n");
-                       root_wait = 0;
+               if (sscanf(slash + 1,
+                          "PARTNROFF=%d%c", &offset, &c) != 1) {
+                       clear_root_wait = true;
                        goto done;
                }
+               cmp.len = slash - uuid_str;
+       } else {
+               cmp.len = strlen(uuid_str);
+       }
+
+       if (!cmp.len) {
+               clear_root_wait = true;
+               goto done;
        }
 
        dev = class_find_device(&block_class, NULL, &cmp,
@@ -164,6 +166,13 @@ static dev_t devt_from_partuuid(const char *uuid_str)
 no_offset:
        put_device(dev);
 done:
+       if (clear_root_wait) {
+               pr_err("VFS: PARTUUID= is invalid.\n"
+                      "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
+               if (root_wait)
+                       pr_err("Disabling rootwait; root= is invalid.\n");
+               root_wait = 0;
+       }
        return res;
 }
 #endif