aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-06-18 14:08:02 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-06-18 14:08:02 +0200
commit3c344aff2bed889dc1b10e5534bfe8e3cff4b708 (patch)
tree9317044718f21372f44883fc40da5ff33e3ef91a
parent6f0eedb416abaa69c2be969b46483e7ba584eedd (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.c4
-rw-r--r--src/utils.c38
-rw-r--r--src/utils.h2
3 files changed, 32 insertions, 12 deletions
diff --git a/src/jail.c b/src/jail.c
index 53f5de0..157a563 100644
--- a/src/jail.c
+++ b/src/jail.c
@@ -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, &current))
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);