summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2023-02-24 22:25:07 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2023-04-13 20:45:22 +0200
commit007d945467499f43656b141171d31f5643b83a6c (patch)
tree16b52ee337ac90998c78752355f1b0a08a3ca41c
parent644d3c7e13c6a64bf5cb628137ee5bd4dada4b74 (diff)
downloaduclient-master.tar.gz
uclient: cancel state change timeout in uclient_disconnect()HEADmaster
When the uloop is ended right after the state change timeout has been armed, the timeout will never be cancelled, without a way for the libuclient user to clean up. When uclient_free() is then called on the uclient context while the uloop is still live, the entry in uloop's timeout list will be dangling, often resulting in a segfault when new timeouts are added or the timeout list is cleaned up in uloop_done(). Fix this by cancelling the timeout in uclient_disconnect(). Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
-rw-r--r--uclient.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/uclient.c b/uclient.c
index a372d4a..ce76bcf 100644
--- a/uclient.c
+++ b/uclient.c
@@ -372,6 +372,7 @@ int uclient_read(struct uclient *cl, char *buf, int len)
void uclient_disconnect(struct uclient *cl)
{
uloop_timeout_cancel(&cl->connection_timeout);
+ uloop_timeout_cancel(&cl->timeout);
if (!cl->backend->disconnect)
return;