summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2016-03-31 11:45:55 +0200
committerKarel Zak <kzak@redhat.com>2016-03-31 11:45:55 +0200
commite9cd2e2bd9ec91a0b1050c4aa79555d142985924 (patch)
tree5da687b76440bcbf7ef925451dfb49379c21d6de
parent37dc502403e97415d23c6eb6e584ebf254a07dd9 (diff)
downloadutil-linux-e9cd2e2bd9ec91a0b1050c4aa79555d142985924.tar.gz
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>
-rw-r--r--libmount/src/tab.c4
-rw-r--r--libmount/src/tab_update.c9
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,