diff options
| author | Matthias Schiffer | 2023-02-24 21:25:07 +0000 |
|---|---|---|
| committer | Matthias Schiffer | 2023-04-13 18:45:22 +0000 |
| commit | 007d945467499f43656b141171d31f5643b83a6c (patch) | |
| tree | 16b52ee337ac90998c78752355f1b0a08a3ca41c | |
| parent | 644d3c7e13c6a64bf5cb628137ee5bd4dada4b74 (diff) | |
| download | uclient-007d945467499f43656b141171d31f5643b83a6c.tar.gz | |
uclient: cancel state change timeout in uclient_disconnect()
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; |