chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core: don't include /boot in effect of ProtectSystem=
[elogind.git]
/
src
/
core
/
execute.c
diff --git
a/src/core/execute.c
b/src/core/execute.c
index fec4b3b13a0cfe2f714ccd818bc13d58ea61fcc1..78fb81f7262771d97002512bb3e5ea964bfa0c67 100644
(file)
--- a/
src/core/execute.c
+++ b/
src/core/execute.c
@@
-69,7
+69,6
@@
#include "ioprio.h"
#include "securebits.h"
#include "namespace.h"
#include "ioprio.h"
#include "securebits.h"
#include "namespace.h"
-#include "tcpwrap.h"
#include "exit-status.h"
#include "missing.h"
#include "utmp-wtmp.h"
#include "exit-status.h"
#include "missing.h"
#include "utmp-wtmp.h"
@@
-123,7
+122,7
@@
static int shift_fds(int fds[], unsigned n_fds) {
if ((nfd = fcntl(fds[i], F_DUPFD, i+3)) < 0)
return -errno;
if ((nfd = fcntl(fds[i], F_DUPFD, i+3)) < 0)
return -errno;
-
close_nointr_nofail
(fds[i]);
+
safe_close
(fds[i]);
fds[i] = nfd;
/* Hmm, the fd we wanted isn't free? Then
fds[i] = nfd;
/* Hmm, the fd we wanted isn't free? Then
@@
-209,7
+208,7
@@
static int open_null_as(int flags, int nfd) {
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
} else
r = nfd;
} else
r = nfd;
@@
-234,12
+233,12
@@
static int connect_logger_as(const ExecContext *context, ExecOutput output, cons
r = connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
if (r < 0) {
r = connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
if (r < 0) {
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
return -errno;
}
if (shutdown(fd, SHUT_RD) < 0) {
return -errno;
}
if (shutdown(fd, SHUT_RD) < 0) {
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
return -errno;
}
return -errno;
}
@@
-263,7
+262,7
@@
static int connect_logger_as(const ExecContext *context, ExecOutput output, cons
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
} else
r = nfd;
} else
r = nfd;
@@
-280,7
+279,7
@@
static int open_terminal_as(const char *path, mode_t mode, int nfd) {
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
if (fd != nfd) {
r = dup2(fd, nfd) < 0 ? -errno : nfd;
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
} else
r = nfd;
} else
r = nfd;
@@
-340,7
+339,7
@@
static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty
if (fd != STDIN_FILENO) {
r = dup2(fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
if (fd != STDIN_FILENO) {
r = dup2(fd, STDIN_FILENO) < 0 ? -errno : STDIN_FILENO;
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
} else
r = STDIN_FILENO;
} else
r = STDIN_FILENO;
@@
-504,7
+503,7
@@
static int setup_confirm_stdio(int *_saved_stdin,
}
if (fd >= 2)
}
if (fd >= 2)
-
close_nointr_nofail
(fd);
+
safe_close
(fd);
*_saved_stdin = saved_stdin;
*_saved_stdout = saved_stdout;
*_saved_stdin = saved_stdin;
*_saved_stdout = saved_stdout;
@@
-512,20
+511,15
@@
static int setup_confirm_stdio(int *_saved_stdin,
return 0;
fail:
return 0;
fail:
- if (saved_stdout >= 0)
- close_nointr_nofail(saved_stdout);
-
- if (saved_stdin >= 0)
- close_nointr_nofail(saved_stdin);
-
- if (fd >= 0)
- close_nointr_nofail(fd);
+ safe_close(saved_stdout);
+ safe_close(saved_stdin);
+ safe_close(fd);
return r;
}
_printf_(1, 2) static int write_confirm_message(const char *format, ...) {
return r;
}
_printf_(1, 2) static int write_confirm_message(const char *format, ...) {
-
int fd
;
+
_cleanup_close_ int fd = -1
;
va_list ap;
assert(format);
va_list ap;
assert(format);
@@
-538,8
+532,6
@@
_printf_(1, 2) static int write_confirm_message(const char *format, ...) {
vdprintf(fd, format, ap);
va_end(ap);
vdprintf(fd, format, ap);
va_end(ap);
- close_nointr_nofail(fd);
-
return 0;
}
return 0;
}
@@
-561,11
+553,8
@@
static int restore_confirm_stdio(int *saved_stdin,
if (dup2(*saved_stdout, STDOUT_FILENO) < 0)
r = -errno;
if (dup2(*saved_stdout, STDOUT_FILENO) < 0)
r = -errno;
- if (*saved_stdin >= 0)
- close_nointr_nofail(*saved_stdin);
-
- if (*saved_stdout >= 0)
- close_nointr_nofail(*saved_stdout);
+ safe_close(*saved_stdin);
+ safe_close(*saved_stdout);
return r;
}
return r;
}
@@
-1125,10
+1114,9
@@
finish:
static void do_idle_pipe_dance(int idle_pipe[4]) {
assert(idle_pipe);
static void do_idle_pipe_dance(int idle_pipe[4]) {
assert(idle_pipe);
- if (idle_pipe[1] >= 0)
- close_nointr_nofail(idle_pipe[1]);
- if (idle_pipe[2] >= 0)
- close_nointr_nofail(idle_pipe[2]);
+
+ safe_close(idle_pipe[1]);
+ safe_close(idle_pipe[2]);
if (idle_pipe[0] >= 0) {
int r;
if (idle_pipe[0] >= 0) {
int r;
@@
-1143,12
+1131,11
@@
static void do_idle_pipe_dance(int idle_pipe[4]) {
fd_wait_for_event(idle_pipe[0], POLLHUP, IDLE_TIMEOUT2_USEC);
}
fd_wait_for_event(idle_pipe[0], POLLHUP, IDLE_TIMEOUT2_USEC);
}
-
close_nointr_nofail
(idle_pipe[0]);
+
safe_close
(idle_pipe[0]);
}
}
- if (idle_pipe[3] >= 0)
- close_nointr_nofail(idle_pipe[3]);
+ safe_close(idle_pipe[3]);
}
static int build_environment(
}
static int build_environment(
@@
-1186,7
+1173,7
@@
static int build_environment(
return -ENOMEM;
our_env[n_env++] = x;
return -ENOMEM;
our_env[n_env++] = x;
- if (asprintf(&x, "WATCHDOG_USEC=
%llu", (unsigned long long)
watchdog_usec) < 0)
+ if (asprintf(&x, "WATCHDOG_USEC=
"USEC_FMT,
watchdog_usec) < 0)
return -ENOMEM;
our_env[n_env++] = x;
}
return -ENOMEM;
our_env[n_env++] = x;
}
@@
-1374,23
+1361,6
@@
int exec_spawn(ExecCommand *command,
goto fail_child;
}
goto fail_child;
}
- if (context->tcpwrap_name) {
- if (socket_fd >= 0)
- if (!socket_tcpwrap(socket_fd, context->tcpwrap_name)) {
- err = -EACCES;
- r = EXIT_TCPWRAP;
- goto fail_child;
- }
-
- for (i = 0; i < (int) n_fds; i++) {
- if (!socket_tcpwrap(fds[i], context->tcpwrap_name)) {
- err = -EACCES;
- r = EXIT_TCPWRAP;
- goto fail_child;
- }
- }
- }
-
exec_context_tty_reset(context);
if (confirm_spawn) {
exec_context_tty_reset(context);
if (confirm_spawn) {
@@
-1599,7
+1569,9
@@
int exec_spawn(ExecCommand *command,
!strv_isempty(context->inaccessible_dirs) ||
context->mount_flags != 0 ||
(context->private_tmp && runtime && (runtime->tmp_dir || runtime->var_tmp_dir)) ||
!strv_isempty(context->inaccessible_dirs) ||
context->mount_flags != 0 ||
(context->private_tmp && runtime && (runtime->tmp_dir || runtime->var_tmp_dir)) ||
- context->private_devices) {
+ context->private_devices ||
+ context->protect_system != PROTECT_SYSTEM_NO ||
+ context->protect_home != PROTECT_HOME_NO) {
char *tmp = NULL, *var = NULL;
char *tmp = NULL, *var = NULL;
@@
-1623,8
+1595,9
@@
int exec_spawn(ExecCommand *command,
tmp,
var,
context->private_devices,
tmp,
var,
context->private_devices,
+ context->protect_home,
+ context->protect_system,
context->mount_flags);
context->mount_flags);
-
if (err < 0) {
r = EXIT_NAMESPACE;
goto fail_child;
if (err < 0) {
r = EXIT_NAMESPACE;
goto fail_child;
@@
-1676,7
+1649,7
@@
int exec_spawn(ExecCommand *command,
if (apply_permissions) {
if (apply_permissions) {
- for (i = 0; i <
RLIMIT_NLIMITS
; i++) {
+ for (i = 0; i <
_RLIMIT_MAX
; i++) {
if (!context->rlimit[i])
continue;
if (!context->rlimit[i])
continue;
@@
-1890,9
+1863,6
@@
void exec_context_done(ExecContext *c) {
free(c->tty_path);
c->tty_path = NULL;
free(c->tty_path);
c->tty_path = NULL;
- free(c->tcpwrap_name);
- c->tcpwrap_name = NULL;
-
free(c->syslog_identifier);
c->syslog_identifier = NULL;
free(c->syslog_identifier);
c->syslog_identifier = NULL;
@@
-2144,6
+2114,8
@@
void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
"%sPrivateTmp: %s\n"
"%sPrivateNetwork: %s\n"
"%sPrivateDevices: %s\n"
"%sPrivateTmp: %s\n"
"%sPrivateNetwork: %s\n"
"%sPrivateDevices: %s\n"
+ "%sProtectHome: %s\n"
+ "%sProtectSystem: %s\n"
"%sIgnoreSIGPIPE: %s\n",
prefix, c->umask,
prefix, c->working_directory ? c->working_directory : "/",
"%sIgnoreSIGPIPE: %s\n",
prefix, c->umask,
prefix, c->working_directory ? c->working_directory : "/",
@@
-2152,6
+2124,8
@@
void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
prefix, yes_no(c->private_tmp),
prefix, yes_no(c->private_network),
prefix, yes_no(c->private_devices),
prefix, yes_no(c->private_tmp),
prefix, yes_no(c->private_network),
prefix, yes_no(c->private_devices),
+ prefix, protect_home_to_string(c->protect_home),
+ prefix, protect_system_to_string(c->protect_system),
prefix, yes_no(c->ignore_sigpipe));
STRV_FOREACH(e, c->environment)
prefix, yes_no(c->ignore_sigpipe));
STRV_FOREACH(e, c->environment)
@@
-2160,11
+2134,6
@@
void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
STRV_FOREACH(e, c->environment_files)
fprintf(f, "%sEnvironmentFile: %s\n", prefix, *e);
STRV_FOREACH(e, c->environment_files)
fprintf(f, "%sEnvironmentFile: %s\n", prefix, *e);
- if (c->tcpwrap_name)
- fprintf(f,
- "%sTCPWrapName: %s\n",
- prefix, c->tcpwrap_name);
-
if (c->nice_set)
fprintf(f,
"%sNice: %i\n",
if (c->nice_set)
fprintf(f,
"%sNice: %i\n",
@@
-2177,7
+2146,8
@@
void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) {
for (i = 0; i < RLIM_NLIMITS; i++)
if (c->rlimit[i])
for (i = 0; i < RLIM_NLIMITS; i++)
if (c->rlimit[i])
- fprintf(f, "%s%s: %llu\n", prefix, rlimit_to_string(i), (unsigned long long) c->rlimit[i]->rlim_max);
+ fprintf(f, "%s%s: "RLIM_FMT"\n",
+ prefix, rlimit_to_string(i), c->rlimit[i]->rlim_max);
if (c->ioprio_set) {
_cleanup_free_ char *class_str = NULL;
if (c->ioprio_set) {
_cleanup_free_ char *class_str = NULL;
@@
-2641,7
+2611,7
@@
ExecRuntime *exec_runtime_unref(ExecRuntime *r) {
if (r->n_ref <= 0) {
free(r->tmp_dir);
free(r->var_tmp_dir);
if (r->n_ref <= 0) {
free(r->tmp_dir);
free(r->var_tmp_dir);
-
close_pipe
(r->netns_storage_socket);
+
safe_close_pair
(r->netns_storage_socket);
free(r);
}
free(r);
}
@@
-2730,9
+2700,7
@@
int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, co
if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd))
log_debug_unit(u->id, "Failed to parse netns socket value %s", value);
else {
if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd))
log_debug_unit(u->id, "Failed to parse netns socket value %s", value);
else {
- if ((*rt)->netns_storage_socket[0] >= 0)
- close_nointr_nofail((*rt)->netns_storage_socket[0]);
-
+ safe_close((*rt)->netns_storage_socket[0]);
(*rt)->netns_storage_socket[0] = fdset_remove(fds, fd);
}
} else if (streq(key, "netns-socket-1")) {
(*rt)->netns_storage_socket[0] = fdset_remove(fds, fd);
}
} else if (streq(key, "netns-socket-1")) {
@@
-2745,9
+2713,7
@@
int exec_runtime_deserialize_item(ExecRuntime **rt, Unit *u, const char *key, co
if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd))
log_debug_unit(u->id, "Failed to parse netns socket value %s", value);
else {
if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd))
log_debug_unit(u->id, "Failed to parse netns socket value %s", value);
else {
- if ((*rt)->netns_storage_socket[1] >= 0)
- close_nointr_nofail((*rt)->netns_storage_socket[1]);
-
+ safe_close((*rt)->netns_storage_socket[1]);
(*rt)->netns_storage_socket[1] = fdset_remove(fds, fd);
}
} else
(*rt)->netns_storage_socket[1] = fdset_remove(fds, fd);
}
} else
@@
-2797,7
+2763,7
@@
void exec_runtime_destroy(ExecRuntime *rt) {
rt->var_tmp_dir = NULL;
}
rt->var_tmp_dir = NULL;
}
-
close_pipe
(rt->netns_storage_socket);
+
safe_close_pair
(rt->netns_storage_socket);
}
static const char* const exec_input_table[_EXEC_INPUT_MAX] = {
}
static const char* const exec_input_table[_EXEC_INPUT_MAX] = {