File bug-1172597_7-daemon-better-error-path-handling-for-shutdown.patch of Package lvm2.16468
From e9b2148dab3a1f501637b628978c93be4d2be086 Mon Sep 17 00:00:00 2001
From: Zdenek Kabelac <zkabelac@redhat.com>
Date: Fri, 8 Nov 2019 13:07:06 +0100
Subject: [PATCH] daemon: better error path handling for shutdown
Report errors for open in better order.
Ensure descriptors are not leaked.
---
libdaemon/server/daemon-server.c | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
index 51e5866..aa9ff2a 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)
--
1.8.3.1