diff options
| author | Xavier Del Campo <xavier.delcampo@midokura.com> | 2023-11-20 12:20:51 +0100 |
|---|---|---|
| committer | Xavier Del Campo <xavier.delcampo@midokura.com> | 2023-11-20 16:25:58 +0100 |
| commit | 59a67a7541ee1559b140494c21a25b195246a4fa (patch) | |
| tree | d2bed79936276954b1d712f33993035d1082062c | |
| parent | 65031ca3502e0c27780be847fd97c112546741a9 (diff) | |
Fix double-free on failed server_client_close
Even if server_client_close fails, it is needed for client_free to
remove the dangling reference from h->clients.
| -rw-r--r-- | handler.c | 7 | ||||
| -rw-r--r-- | server.c | 1 |
2 files changed, 2 insertions, 6 deletions
@@ -152,13 +152,13 @@ static void client_free(struct client *const c) static int remove_client_from_list(struct handler *const h, struct client *const c) { - int ret = -1; + int ret = 0; if (server_client_close(h->server, c->c)) { fprintf(stderr, "%s: server_client_close failed\n", __func__); - goto end; + ret = -1; } for (struct client *cl = h->clients, *prev = NULL; cl; @@ -175,9 +175,6 @@ static int remove_client_from_list(struct handler *const h, } } - ret = 0; - -end: client_free(c); return ret; } @@ -59,7 +59,6 @@ int server_client_close(struct server *const s, struct server_client *const c) { fprintf(stderr, "%s: close(2): %s\n", __func__, strerror(errno)); - return -1; } else if (ref->prev) ref->prev->next = next; |
