]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: Fix possible NULL dereference in get_btrfs_fs_root()
authorKarel Zak <kzak@redhat.com>
Thu, 31 Mar 2016 09:45:55 +0000 (11:45 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 31 Mar 2016 09:45:55 +0000 (11:45 +0200)
The function mnt_table_get_fs_root() should be robust enough to accept
NULL as mountinfo -- the right behaviour is to default to '/'.

The set_fs_root() (tab_update.c) has to understand when mountinfo is
necessary (for bind mounts and btrfs).

Reported-by: Stanislav Brabec <sbrabec@suse.cz>
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/tab.c
libmount/src/tab_update.c

index a7a1b6b1ef6a5e05fb61f83c2832db0e5d1585af..d7a633cba89d42fb16661292536e36d08da6fb0f 100644 (file)
@@ -1346,6 +1346,8 @@ err:
  *
  * For btrfs subvolumes this function returns NULL, but @fsroot properly set.
  *
+ * If @tb is NULL then defaults to '/'.
+ *
  * Returns: entry from @tb that will be used as a source for @fs if the @fs is
  *          bindmount.
  *
@@ -1432,7 +1434,7 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb,
        /*
         * btrfs-subvolume mount -- get subvolume name and use it as a root-fs path
         */
-       else if (fstype && (!strcmp(fstype, "btrfs") || !strcmp(fstype, "auto"))) {
+       else if (tb && fstype && (!strcmp(fstype, "btrfs") || !strcmp(fstype, "auto"))) {
                if (get_btrfs_fs_root(tb, fs, &root) < 0)
                        goto err;
        }
index 40adba98a0a441949da89ab0b8e7e730796c5cda..631e1cd9fd229409b435d46f07992b67caa8ee03 100644 (file)
@@ -357,7 +357,7 @@ static int set_fs_root(struct libmnt_update *upd, struct libmnt_fs *fs,
 {
        struct libmnt_fs *src_fs;
        char *fsroot = NULL;
-       const char *src;
+       const char *src, *fstype;
        int rc = 0;
 
        DBG(UPDATE, ul_debug("setting FS root"));
@@ -366,16 +366,21 @@ static int set_fs_root(struct libmnt_update *upd, struct libmnt_fs *fs,
        assert(upd->fs);
        assert(fs);
 
+       fstype = mnt_fs_get_fstype(fs);
+
        if (mountflags & MS_BIND) {
                if (!upd->mountinfo)
                        upd->mountinfo = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
-
                src = mnt_fs_get_srcpath(fs);
                if (src) {
                         rc = mnt_fs_set_bindsrc(upd->fs, src);
                         if (rc)
                                 goto err;
                }
+
+       } else if (fstype && (strcmp(fstype, "btrfs") == 0 || strcmp(fstype, "auto") == 0)) {
+               if (!upd->mountinfo)
+                       upd->mountinfo = mnt_new_table_from_file(_PATH_PROC_MOUNTINFO);
        }
 
        src_fs = mnt_table_get_fs_root(upd->mountinfo, fs,