summaryrefslogtreecommitdiff
path: root/src/core/service.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-04-28 16:51:30 +0200
committerLennart Poettering <lennart@poettering.net>2016-04-29 16:27:48 +0200
commit7f2fbbff06519a486a37ad140ea9200513d42747 (patch)
treeb5e271051174af96db7f55f7f2997df7af8f29f6 /src/core/service.c
parentf0367da7d1a61ad698a55d17b5c28ddce0dc265a (diff)
core: minor error path fix
In service_set_socket_fd(), let's make sure that if we can't add the requested dependencies we take no possession of the passed connection fd. This way, we follow the strict rule: we take possession of the passed fd on success, but on failure we don't, and the fd remains in possession of the caller.
Diffstat (limited to 'src/core/service.c')
-rw-r--r--src/core/service.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/core/service.c b/src/core/service.c
index b46dd8bcdd..3c4328c584 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -3139,9 +3139,8 @@ int service_set_socket_fd(Service *s, int fd, Socket *sock, bool selinux_context
assert(s);
assert(fd >= 0);
- /* This is called by the socket code when instantiating a new
- * service for a stream socket and the socket needs to be
- * configured. */
+ /* This is called by the socket code when instantiating a new service for a stream socket and the socket needs
+ * to be configured. We take ownership of the passed fd on success. */
if (UNIT(s)->load_state != UNIT_LOADED)
return -EINVAL;
@@ -3169,12 +3168,15 @@ int service_set_socket_fd(Service *s, int fd, Socket *sock, bool selinux_context
return r;
}
+ r = unit_add_two_dependencies(UNIT(sock), UNIT_BEFORE, UNIT_TRIGGERS, UNIT(s), false);
+ if (r < 0)
+ return r;
+
s->socket_fd = fd;
s->socket_fd_selinux_context_net = selinux_context_net;
unit_ref_set(&s->accept_socket, UNIT(sock));
-
- return unit_add_two_dependencies(UNIT(sock), UNIT_BEFORE, UNIT_TRIGGERS, UNIT(s), false);
+ return 0;
}
static void service_reset_failed(Unit *u) {