Btrfs-progs: Fix set_label_unmounted() with label length validation
authorJeff Liu <jeff.liu@oracle.com>
Mon, 17 Dec 2012 11:35:27 +0000 (11:35 +0000)
committerDavid Sterba <dsterba@suse.cz>
Tue, 26 Feb 2013 18:24:14 +0000 (19:24 +0100)
Currently, we keeping silent if the label length is exceeding BTRFS_LABEL_SIZE - 1, and just
truncating the characters beyond that.

This patch make it return error and exit in this situation.

Signed-off-by: Jie Liu <jeff.liu@oracle.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
btrfslabel.c

index 7aea996..dcc776e 100644 (file)
@@ -63,6 +63,12 @@ static int set_label_unmounted(const char *dev, const char *label)
                return -1;
        }
 
+       if (strlen(label) > BTRFS_LABEL_SIZE - 1) {
+               fprintf(stderr, "ERROR: Label %s is too long (max %d)\n",
+                       label, BTRFS_LABEL_SIZE - 1);
+               return -1;
+       }
+
        /* Open the super_block at the default location
         * and as read-write.
         */
@@ -71,8 +77,8 @@ static int set_label_unmounted(const char *dev, const char *label)
                return -1;
 
        trans = btrfs_start_transaction(root, 1);
-       strncpy(root->fs_info->super_copy.label, label, BTRFS_LABEL_SIZE);
-       root->fs_info->super_copy.label[BTRFS_LABEL_SIZE-1] = 0;
+       snprintf(root->fs_info->super_copy.label, BTRFS_LABEL_SIZE, "%s",
+                label);
        btrfs_commit_transaction(trans, root);
 
        /* Now we close it since we are done. */