summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-11-25 19:01:36 +0100
committerLennart Poettering <lennart@poettering.net>2016-12-01 00:25:51 +0100
commit68cf43c3154cd18bfdf46df07f854d8272062ab9 (patch)
treec58e17357440599e43e2c032fe8ef33654e2f516
parentfc4b68e557307b04d42bcef3181fef00b7558177 (diff)
nspawn: use chase_symlinks() on all paths specified via --tmpfs=, --bind= and so on
Fixes: #2860
-rw-r--r--src/nspawn/nspawn-mount.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/nspawn/nspawn-mount.c b/src/nspawn/nspawn-mount.c
index cbc5b93c2a..914e43da98 100644
--- a/src/nspawn/nspawn-mount.c
+++ b/src/nspawn/nspawn-mount.c
@@ -495,10 +495,10 @@ static int parse_mount_bind_options(const char *options, unsigned long *mount_fl
}
static int mount_bind(const char *dest, CustomMount *m) {
- struct stat source_st, dest_st;
- const char *where;
+
+ _cleanup_free_ char *mount_opts = NULL, *where = NULL;
unsigned long mount_flags = MS_BIND | MS_REC;
- _cleanup_free_ char *mount_opts = NULL;
+ struct stat source_st, dest_st;
int r;
assert(m);
@@ -512,7 +512,9 @@ static int mount_bind(const char *dest, CustomMount *m) {
if (stat(m->source, &source_st) < 0)
return log_error_errno(errno, "Failed to stat %s: %m", m->source);
- where = prefix_roota(dest, m->destination);
+ r = chase_symlinks_prefix(m->destination, dest, &where);
+ if (r < 0)
+ return log_error_errno(r, "Failed to resolve %s: %m", m->destination);
if (stat(where, &dest_st) >= 0) {
if (S_ISDIR(source_st.st_mode) && !S_ISDIR(dest_st.st_mode)) {
@@ -563,14 +565,16 @@ static int mount_tmpfs(
bool userns, uid_t uid_shift, uid_t uid_range,
const char *selinux_apifs_context) {
- const char *where, *options;
- _cleanup_free_ char *buf = NULL;
+ const char *options;
+ _cleanup_free_ char *buf = NULL, *where = NULL;
int r;
assert(dest);
assert(m);
- where = prefix_roota(dest, m->destination);
+ r = chase_symlinks_prefix(m->destination, dest, &where);
+ if (r < 0)
+ return log_error_errno(r, "Failed to resolve %s: %m", m->destination);
r = mkdir_p_label(where, 0755);
if (r < 0 && r != -EEXIST)
@@ -600,14 +604,17 @@ static char *joined_and_escaped_lower_dirs(char * const *lower) {
}
static int mount_overlay(const char *dest, CustomMount *m) {
- _cleanup_free_ char *lower = NULL;
- const char *where, *options;
+
+ _cleanup_free_ char *lower = NULL, *where = NULL;
+ const char *options;
int r;
assert(dest);
assert(m);
- where = prefix_roota(dest, m->destination);
+ r = chase_symlinks_prefix(m->destination, dest, &where);
+ if (r < 0)
+ return log_error_errno(r, "Failed to resolve %s: %m", m->destination);
r = mkdir_label(where, 0755);
if (r < 0 && r != -EEXIST)