diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2023-02-24 22:25:07 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2023-04-13 20:45:22 +0200 |
commit | 007d945467499f43656b141171d31f5643b83a6c (patch) | |
tree | 16b52ee337ac90998c78752355f1b0a08a3ca41c | |
parent | 644d3c7e13c6a64bf5cb628137ee5bd4dada4b74 (diff) | |
download | uclient-master.tar.gz |
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.c | 1 |
1 files changed, 1 insertions, 0 deletions
@@ -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; |