X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fsocket.c;h=d57e7701cae642e1e6db007ee142b9d03c6a48bc;hp=b39bec2f261f9fafb2336f52181c44135e906d4a;hb=9754d56e9b21bfe89fc18f47987d6bef491b8521;hpb=315db1a8aed226a51a4cf700172249cfd10ae115 diff --git a/src/core/socket.c b/src/core/socket.c index b39bec2f2..d57e7701c 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -90,13 +90,8 @@ static void socket_init(Unit *u) { s->ip_ttl = -1; s->mark = -1; - exec_context_init(&s->exec_context); s->exec_context.std_output = u->manager->default_std_output; s->exec_context.std_error = u->manager->default_std_error; - kill_context_init(&s->kill_context); - cgroup_context_init(&s->cgroup_context); - - unit_cgroup_context_init_defaults(u, &s->cgroup_context); s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID; } @@ -121,9 +116,7 @@ void socket_free_ports(Socket *s) { sd_event_source_unref(p->event_source); - if (p->fd >= 0) - close_nointr_nofail(p->fd); - + safe_close(p->fd); free(p->path); free(p); } @@ -136,8 +129,6 @@ static void socket_done(Unit *u) { socket_free_ports(s); - cgroup_context_done(&s->cgroup_context); - exec_context_done(&s->exec_context); s->exec_runtime = exec_runtime_unref(s->exec_runtime); exec_command_free_array(s->exec_command, _SOCKET_EXEC_COMMAND_MAX); s->control_command = NULL; @@ -177,7 +168,12 @@ static int socket_arm_timer(Socket *s) { return sd_event_source_set_enabled(s->timer_event_source, SD_EVENT_ONESHOT); } - return sd_event_add_monotonic(UNIT(s)->manager->event, &s->timer_event_source, now(CLOCK_MONOTONIC) + s->timeout_usec, 0, socket_dispatch_timer, s); + return sd_event_add_time( + UNIT(s)->manager->event, + &s->timer_event_source, + CLOCK_MONOTONIC, + now(CLOCK_MONOTONIC) + s->timeout_usec, 0, + socket_dispatch_timer, s); } static int socket_instantiate_service(Socket *s) { @@ -338,7 +334,7 @@ static int socket_add_extras(Socket *s) { if (r < 0) return r; - r = unit_exec_context_patch_defaults(u, &s->exec_context); + r = unit_patch_contexts(u); if (r < 0) return r; @@ -347,7 +343,7 @@ static int socket_add_extras(Socket *s) { if (r < 0) return r; - r = unit_add_default_slice(u); + r = unit_add_default_slice(u, &s->cgroup_context); if (r < 0) return r; } @@ -667,17 +663,21 @@ static int instance_from_socket(int fd, unsigned nr, char **instance) { int k; k = getpeercred(fd, &ucred); - if (k < 0) + if (k >= 0) { + if (asprintf(&r, + "%u-"PID_FMT"-"UID_FMT, + nr, ucred.pid, ucred.uid) < 0) + return -ENOMEM; + } else if (k == -ENODATA) { + /* This handles the case where somebody is + * connecting from another pid/uid namespace + * (e.g. from outside of our container). */ + if (asprintf(&r, + "%u-unknown", + nr) < 0) + return -ENOMEM; + } else return k; - - if (asprintf(&r, - "%u-%lu-%lu", - nr, - (unsigned long) ucred.pid, - (unsigned long) ucred.uid) < 0) - return -ENOMEM; - - break; } default: @@ -700,7 +700,7 @@ static void socket_close_fds(Socket *s) { if (p->fd < 0) continue; - close_nointr_nofail(p->fd); + p->fd = safe_close(p->fd); /* One little note: we should never delete any sockets * in the file system here! After all some other @@ -709,8 +709,6 @@ static void socket_close_fds(Socket *s) { * we delete sockets in the file system before we * create a new one, not after we stopped using * one! */ - - p->fd = -1; } } @@ -880,9 +878,7 @@ static int fifo_address_create( fail: label_context_clear(); - - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -917,8 +913,7 @@ static int special_address_create( return 0; fail: - if (fd >= 0) - close_nointr_nofail(fd); + safe_close(fd); return r; } @@ -977,9 +972,7 @@ static int mq_address_create( return 0; fail: - if (fd >= 0) - close_nointr_nofail(fd); - + safe_close(fd); return r; } @@ -1472,7 +1465,7 @@ static void socket_enter_running(Socket *s, int cfd) { log_debug_unit(UNIT(s)->id, "Suppressing connection request on %s since unit stop is scheduled.", UNIT(s)->id); if (cfd >= 0) - close_nointr_nofail(cfd); + safe_close(cfd); else { /* Flush all sockets by closing and reopening them */ socket_close_fds(s); @@ -1520,7 +1513,7 @@ static void socket_enter_running(Socket *s, int cfd) { if (s->n_connections >= s->max_connections) { log_warning_unit(UNIT(s)->id, "%s: Too many incoming connections (%u)", UNIT(s)->id, s->n_connections); - close_nointr_nofail(cfd); + safe_close(cfd); return; } @@ -1535,7 +1528,7 @@ static void socket_enter_running(Socket *s, int cfd) { /* ENOTCONN is legitimate if TCP RST was received. * This connection is over, but the socket unit lives on. */ - close_nointr_nofail(cfd); + safe_close(cfd); return; } @@ -1586,9 +1579,7 @@ fail: bus_error_message(&error, r)); socket_enter_stop_pre(s, SOCKET_FAILURE_RESOURCES); - - if (cfd >= 0) - close_nointr_nofail(cfd); + safe_close(cfd); } static void socket_run_next(Socket *s) { @@ -1819,8 +1810,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1839,8 +1829,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1859,8 +1848,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1878,8 +1866,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } } @@ -1897,8 +1884,7 @@ static int socket_deserialize_item(Unit *u, const char *key, const char *value, break; if (p) { - if (p->fd >= 0) - close_nointr_nofail(p->fd); + safe_close(p->fd); p->fd = fdset_remove(fds, fd); } }