core: make sure to close connection fd when we fail to activate a per-connection service

Fixes: #2993 #2691
This commit is contained in:
Lennart Poettering
2016-04-29 16:27:48 +02:00
parent 7f2fbbff06
commit 3e7a1f50e4
3 changed files with 7 additions and 2 deletions
+1 -1
View File
@@ -180,7 +180,7 @@ static int service_set_main_pid(Service *s, pid_t pid) {
return 0;
}
static void service_close_socket_fd(Service *s) {
void service_close_socket_fd(Service *s) {
assert(s);
s->socket_fd = asynchronous_close(s->socket_fd);
+1
View File
@@ -198,6 +198,7 @@ struct Service {
extern const UnitVTable service_vtable;
int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
void service_close_socket_fd(Service *s);
const char* service_restart_to_string(ServiceRestart i) _const_;
ServiceRestart service_restart_from_string(const char *s) _pure_;
+5 -1
View File
@@ -2010,8 +2010,12 @@ static void socket_enter_running(Socket *s, int cfd) {
s->n_connections++;
r = manager_add_job(UNIT(s)->manager, JOB_START, UNIT(service), JOB_REPLACE, &error, NULL);
if (r < 0)
if (r < 0) {
/* We failed to activate the new service, but it still exists. Let's make sure the service
* closes and forgets the connection fd again, immediately. */
service_close_socket_fd(service);
goto fail;
}
/* Notify clients about changed counters */
unit_add_to_dbus_queue(UNIT(s));