From cebacbd9216005aa1c32cbb34d9c9af3c3440e77 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sat, 26 Oct 2013 13:51:06 +0200 Subject: [PATCH] socket frontend: Disallow duplicate listen_and_serve() calls. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit … and fixed a memory leak. --- src/frontend/sock.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/frontend/sock.c b/src/frontend/sock.c index be69f0a..9fba695 100644 --- a/src/frontend/sock.c +++ b/src/frontend/sock.c @@ -476,6 +476,9 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop) if ((! sock) || (! sock->listeners_num) || (! loop)) return -1; + if (sock->chan) + return -1; + FD_ZERO(&sockets); for (i = 0; i < sock->listeners_num; ++i) { @@ -523,7 +526,7 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop) if (! iter) { sdb_log(SDB_LOG_ERR, "frontend: Failed to acquire iterator " "for open connections"); - return -1; + break; } while (sdb_llist_iter_has_next(iter)) { @@ -546,7 +549,7 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop) sdb_log(SDB_LOG_ERR, "frontend: Failed to monitor sockets: %s", sdb_strerror(errno, buf, sizeof(buf))); - return -1; + break; } if (! n) @@ -563,7 +566,7 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop) if (! iter) { sdb_log(SDB_LOG_ERR, "frontend: Failed to acquire iterator " "for open connections"); - return -1; + break; } while (sdb_llist_iter_has_next(iter)) { @@ -587,6 +590,9 @@ sdb_fe_sock_listen_and_serve(sdb_fe_socket_t *sock, sdb_fe_loop_t *loop) for (i = 0; i < SDB_STATIC_ARRAY_LEN(handler_threads); ++i) pthread_join(handler_threads[i], NULL); /* else: we tried our best; let the operating system clean up */ + + sdb_channel_destroy(sock->chan); + sock->chan = NULL; return 0; } /* sdb_fe_sock_listen_and_server */ -- 2.30.2