Merge pull request #17219 from poettering/exec-root-dir

minor tweaks to execute.[ch]
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2020-10-01 20:01:46 +02:00 committed by GitHub
commit a53d1b17e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 9 deletions

View file

@ -9,3 +9,8 @@ expression s;
@@ @@
- (empty_or_root(s) ? "/" : s) - (empty_or_root(s) ? "/" : s)
+ empty_to_root(s) + empty_to_root(s)
@@
expression s;
@@
- (s ? s : "/")
+ empty_to_root(s)

View file

@ -2983,7 +2983,7 @@ static int compile_bind_mounts(
continue; continue;
if (exec_directory_is_private(context, t) && if (exec_directory_is_private(context, t) &&
!(context->root_directory || context->root_image)) { !exec_context_with_rootfs(context)) {
char *private_root; char *private_root;
/* So this is for a dynamic user, and we need to make sure the process can access its own /* So this is for a dynamic user, and we need to make sure the process can access its own
@ -3014,7 +3014,7 @@ static int compile_bind_mounts(
} }
if (exec_directory_is_private(context, t) && if (exec_directory_is_private(context, t) &&
(context->root_directory || context->root_image)) exec_context_with_rootfs(context))
/* When RootDirectory= or RootImage= are set, then the symbolic link to the private /* When RootDirectory= or RootImage= are set, then the symbolic link to the private
* directory is not created on the root directory. So, let's bind-mount the directory * directory is not created on the root directory. So, let's bind-mount the directory
* on the 'non-private' place. */ * on the 'non-private' place. */
@ -3245,10 +3245,8 @@ static int apply_working_directory(
wd = home; wd = home;
} else if (context->working_directory) } else
wd = context->working_directory; wd = empty_to_root(context->working_directory);
else
wd = "/";
if (params->flags & EXEC_APPLY_CHROOT) if (params->flags & EXEC_APPLY_CHROOT)
d = wd; d = wd;
@ -5171,8 +5169,8 @@ void exec_context_dump(const ExecContext *c, FILE* f, const char *prefix) {
"%sProtectProc: %s\n" "%sProtectProc: %s\n"
"%sProcSubset: %s\n", "%sProcSubset: %s\n",
prefix, c->umask, prefix, c->umask,
prefix, c->working_directory ? c->working_directory : "/", prefix, empty_to_root(c->working_directory),
prefix, c->root_directory ? c->root_directory : "/", prefix, empty_to_root(c->root_directory),
prefix, yes_no(c->non_blocking), prefix, yes_no(c->non_blocking),
prefix, yes_no(c->private_tmp), prefix, yes_no(c->private_tmp),
prefix, yes_no(c->private_devices), prefix, yes_no(c->private_devices),
@ -5658,7 +5656,7 @@ bool exec_context_get_effective_mount_apivfs(const ExecContext *c) {
return c->mount_apivfs; return c->mount_apivfs;
/* Default to "yes" if root directory or image are specified */ /* Default to "yes" if root directory or image are specified */
if (c->root_image || !empty_or_root(c->root_directory)) if (exec_context_with_rootfs(c))
return true; return true;
return false; return false;

View file

@ -23,6 +23,7 @@ typedef struct Manager Manager;
#include "namespace.h" #include "namespace.h"
#include "nsflags.h" #include "nsflags.h"
#include "numa-util.h" #include "numa-util.h"
#include "path-util.h"
#include "time-util.h" #include "time-util.h"
#define EXEC_STDIN_DATA_MAX (64U*1024U*1024U) #define EXEC_STDIN_DATA_MAX (64U*1024U*1024U)
@ -325,6 +326,14 @@ static inline bool exec_context_restrict_namespaces_set(const ExecContext *c) {
return (c->restrict_namespaces & NAMESPACE_FLAGS_ALL) != NAMESPACE_FLAGS_ALL; return (c->restrict_namespaces & NAMESPACE_FLAGS_ALL) != NAMESPACE_FLAGS_ALL;
} }
static inline bool exec_context_with_rootfs(const ExecContext *c) {
assert(c);
/* Checks if RootDirectory= or RootImage= are used */
return !empty_or_root(c->root_directory) || c->root_image;
}
typedef enum ExecFlags { typedef enum ExecFlags {
EXEC_APPLY_SANDBOXING = 1 << 0, EXEC_APPLY_SANDBOXING = 1 << 0,
EXEC_APPLY_CHROOT = 1 << 1, EXEC_APPLY_CHROOT = 1 << 1,