diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2018-06-18 14:08:02 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2018-06-18 14:08:02 +0200 |
commit | 3c344aff2bed889dc1b10e5534bfe8e3cff4b708 (patch) | |
tree | 9317044718f21372f44883fc40da5ff33e3ef91a | |
parent | 6f0eedb416abaa69c2be969b46483e7ba584eedd (diff) |
check if a file path is an mountpoint (not only directories)
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r-- | src/jail.c | 4 | ||||
-rw-r--r-- | src/utils.c | 38 | ||||
-rw-r--r-- | src/utils.h | 2 |
3 files changed, 32 insertions, 12 deletions
@@ -304,7 +304,7 @@ static int jail_childfn(prisoner_process *ctx) S_IROTH|S_IXOTH); if (s && errno != EEXIST) FATAL("Create directory '%s'", path_dev); - if (!dir_is_mountpoint(path_dev) && mount_dev(path_dev)) + if (!path_is_mountpoint(path_dev) && mount_dev(path_dev)) FATAL("Mount devtmpfs to '%s%s'", ctx->newroot, path_dev); D2("Mounting devpts to '%s%s'", ctx->newroot, path_devpts); @@ -313,7 +313,7 @@ static int jail_childfn(prisoner_process *ctx) S_IROTH|S_IXOTH); if (s && errno != EEXIST) FATAL("Create directory '%s'", path_devpts); - if (!dir_is_mountpoint(path_devpts) && mount_pts(path_devpts)) + if (!path_is_mountpoint(path_devpts) && mount_pts(path_devpts)) FATAL("Mount devpts to '%s%s'", ctx->newroot, path_devpts); D2("Mounting proc to '%s%s'", ctx->newroot, path_proc); diff --git a/src/utils.c b/src/utils.c index dd7657c..fc0770a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -20,6 +20,7 @@ #include <sys/prctl.h> #include <sys/mount.h> #include <linux/limits.h> +#include <libgen.h> #include <assert.h> #include "utils.h" @@ -349,22 +350,36 @@ int safe_chroot(const char *newroot) return 0; } -int dir_is_mountpoint(const char *path) +int path_is_mountpoint(const char *path) { struct stat current = {0}, parent = {0}; size_t plen = strnlen(path, PATH_MAX); char parent_path[plen + 4]; + char *dirc, *dname; if (stat(path, ¤t)) goto error; - strncpy(parent_path, path, plen); - parent_path[plen] = '/'; - parent_path[plen+1] = '.'; - parent_path[plen+2] = '.'; - parent_path[plen+3] = 0; - if (stat(parent_path, &parent)) - goto error; + if (S_ISREG(current.st_mode)) { + dirc = strdup(path); + assert(dirc); + dname = dirname(dirc); + + if (stat(dname, &parent)) { + free(dirc); + goto error; + } + free(dirc); + } else { + strncpy(parent_path, path, plen); + parent_path[plen] = '/'; + parent_path[plen+1] = '.'; + parent_path[plen+2] = '.'; + parent_path[plen+3] = 0; + + if (stat(parent_path, &parent)) + goto error; + } return current.st_dev != parent.st_dev; error: @@ -461,6 +476,11 @@ int setup_network_namespace(const char *name) } } + if (path_is_mountpoint(netns_path)) { + N2("Network namespace '%s' already mounted, doing nothing.", netns_path); + return 0; + } + while (mount("", getopt_str(OPT_NETNS_RUN_DIR), "none", MS_SHARED|MS_REC, NULL)) { @@ -517,7 +537,7 @@ int switch_network_namespace(const char *name) getopt_str(OPT_NETNS_RUN_DIR), name); netns = open(net_path, O_RDONLY | O_CLOEXEC); if (netns < 0) { - E_STRERR("Cannot open network namespace '%s'", name); + E_STRERR("Open network namespace '%s'", name); return 1; } diff --git a/src/utils.h b/src/utils.h index 8e2ee7d..7d7f617 100644 --- a/src/utils.h +++ b/src/utils.h @@ -34,7 +34,7 @@ int change_default_user_group(void); int safe_chroot(const char *newroot); -int dir_is_mountpoint(const char *path); +int path_is_mountpoint(const char *path); void chk_chroot(void); |