diff options
author | Karel Zak | 2016-03-31 11:45:55 +0200 |
---|---|---|
committer | Karel Zak | 2016-03-31 11:45:55 +0200 |
commit | e9cd2e2bd9ec91a0b1050c4aa79555d142985924 (patch) | |
tree | 5da687b76440bcbf7ef925451dfb49379c21d6de /libmount/src | |
parent | tests: add DM error target for blkid (diff) | |
download | kernel-qcow2-util-linux-e9cd2e2bd9ec91a0b1050c4aa79555d142985924.tar.gz kernel-qcow2-util-linux-e9cd2e2bd9ec91a0b1050c4aa79555d142985924.tar.xz kernel-qcow2-util-linux-e9cd2e2bd9ec91a0b1050c4aa79555d142985924.zip |
libmount: Fix possible NULL dereference in get_btrfs_fs_root()
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>
Diffstat (limited to 'libmount/src')
-rw-r--r-- | libmount/src/tab.c | 4 | ||||
-rw-r--r-- | libmount/src/tab_update.c | 9 |
2 files changed, 10 insertions, 3 deletions
diff --git a/libmount/src/tab.c b/libmount/src/tab.c index a7a1b6b1e..d7a633cba 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -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; } diff --git a/libmount/src/tab_update.c b/libmount/src/tab_update.c index 40adba98a..631e1cd9f 100644 --- a/libmount/src/tab_update.c +++ b/libmount/src/tab_update.c @@ -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, |