summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-03-11 09:06:10 +0100
committerGitHub <noreply@github.com>2020-03-11 09:06:10 +0100
commit693040bde5162c8af3d0f063414288eba5255b3c (patch)
tree4004787972d41376702e9b39b19469c8fe85b486 /src
parentudev: add debug logs for delaying and delegation of events (diff)
parentexecute: don't create /tmp and /var/tmp if both are inaccessible (diff)
downloadsystemd-693040bde5162c8af3d0f063414288eba5255b3c.tar.xz
systemd-693040bde5162c8af3d0f063414288eba5255b3c.zip
Merge pull request #15063 from topimiettinen/execute-dont-create-tmp-dirs-if-inaccessible
Execute: don't create temp dirs if inaccessible
Diffstat (limited to 'src')
-rw-r--r--src/basic/path-util.c16
-rw-r--r--src/basic/path-util.h1
-rw-r--r--src/core/execute.c5
-rw-r--r--src/core/namespace.c8
4 files changed, 25 insertions, 5 deletions
diff --git a/src/basic/path-util.c b/src/basic/path-util.c
index 49a211a527..ba13de01ff 100644
--- a/src/basic/path-util.c
+++ b/src/basic/path-util.c
@@ -1125,3 +1125,19 @@ bool path_strv_contains(char **l, const char *path) {
return false;
}
+
+bool prefixed_path_strv_contains(char **l, const char *path) {
+ char **i, *j;
+
+ STRV_FOREACH(i, l) {
+ j = *i;
+ if (*j == '-')
+ j++;
+ if (*j == '+')
+ j++;
+ if (path_equal(j, path))
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/basic/path-util.h b/src/basic/path-util.h
index f49a876f3d..30031fca8e 100644
--- a/src/basic/path-util.h
+++ b/src/basic/path-util.h
@@ -173,3 +173,4 @@ static inline const char *empty_to_root(const char *path) {
}
bool path_strv_contains(char **l, const char *path);
+bool prefixed_path_strv_contains(char **l, const char *path);
diff --git a/src/core/execute.c b/src/core/execute.c
index 587b77a3f4..00a2f2e17e 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -5371,7 +5371,10 @@ static int exec_runtime_make(Manager *m, const ExecContext *c, const char *id, E
if (!c->private_network && !c->private_tmp && !c->network_namespace_path)
return 0;
- if (c->private_tmp) {
+ if (c->private_tmp &&
+ !(prefixed_path_strv_contains(c->inaccessible_paths, "/tmp") &&
+ (prefixed_path_strv_contains(c->inaccessible_paths, "/var/tmp") ||
+ prefixed_path_strv_contains(c->inaccessible_paths, "/var")))) {
r = setup_tmp_dirs(id, &tmp_dir, &var_tmp_dir);
if (r < 0)
return r;
diff --git a/src/core/namespace.c b/src/core/namespace.c
index cda9d2ca1d..a461a3cce4 100644
--- a/src/core/namespace.c
+++ b/src/core/namespace.c
@@ -1192,7 +1192,7 @@ static bool root_read_only(
if (protect_system == PROTECT_SYSTEM_STRICT)
return true;
- if (path_strv_contains(read_only_paths, "/"))
+ if (prefixed_path_strv_contains(read_only_paths, "/"))
return true;
return false;
@@ -1217,9 +1217,9 @@ static bool home_read_only(
if (protect_home != PROTECT_HOME_NO)
return true;
- if (path_strv_contains(read_only_paths, "/home") ||
- path_strv_contains(inaccessible_paths, "/home") ||
- path_strv_contains(empty_directories, "/home"))
+ if (prefixed_path_strv_contains(read_only_paths, "/home") ||
+ prefixed_path_strv_contains(inaccessible_paths, "/home") ||
+ prefixed_path_strv_contains(empty_directories, "/home"))
return true;
for (i = 0; i < n_temporary_filesystems; i++)