diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2019-11-08 13:07:06 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2019-11-08 15:12:51 +0100 |
commit | e9b2148dab3a1f501637b628978c93be4d2be086 (patch) | |
tree | 556ed9f5c67f6d8da7ecd61c8af67dac683208ca | |
parent | 34bde8b6c7e517239a05334683a09f2b5075fdcc (diff) | |
download | lvm2-e9b2148dab3a1f501637b628978c93be4d2be086.tar.gz |
daemon: better error path handling for shutdown
Report errors for open in better order.
Ensure descriptors are not leaked.
-rw-r--r-- | libdaemon/server/daemon-server.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c index 51e5866fb..aa9ff2ab3 100644 --- a/libdaemon/server/daemon-server.c +++ b/libdaemon/server/daemon-server.c @@ -513,20 +513,23 @@ static int _handle_connect(daemon_state s) socklen_t sl = sizeof(sockaddr); client.socket_fd = accept(s.socket_fd, (struct sockaddr *) &sockaddr, &sl); - if (client.socket_fd < 0 || _shutdown_requested) { - if (errno != EAGAIN || !_shutdown_requested) + if (client.socket_fd < 0) { + if (errno != EAGAIN) ERROR(&s, "Failed to accept connection: %s.", strerror(errno)); - return 0; + goto bad; + } + + if (_shutdown_requested) { + ERROR(&s, "Shutdown requested."); + goto bad; } - if (fcntl(client.socket_fd, F_SETFD, FD_CLOEXEC)) + if (fcntl(client.socket_fd, F_SETFD, FD_CLOEXEC)) WARN(&s, "setting CLOEXEC on client socket fd %d failed", client.socket_fd); if (!(ts = dm_malloc(sizeof(thread_state)))) { - if (close(client.socket_fd)) - perror("close"); ERROR(&s, "Failed to allocate thread state"); - return 0; + goto bad; } ts->next = s.threads->next; @@ -538,10 +541,16 @@ static int _handle_connect(daemon_state s) if ((errno = pthread_create(&ts->client.thread_id, NULL, _client_thread, ts))) { ERROR(&s, "Failed to create client thread: %s.", strerror(errno)); - return 0; + ts->active = 0; + goto bad; } return 1; +bad: + if ((client.socket_fd >= 0) && close(client.socket_fd)) + perror("close"); + + return 0; } static void _reap(daemon_state s, int waiting) |