gsocketclient: Fix still-reachable references to cancellables
GSocketClient
chains its internal GCancellable
objects to ones
provided by the caller in two places using g_cancellable_connect()
.
However, it never calls g_cancellable_disconnect()
, instead relying
(incorrectly) on the GCancellable
provided by the caller being
short-lived.
In the (valid) situation where a caller reuses one GCancellable
for
multiple socket client calls, or for calls across multiple socket
clients, this will cause the internal GCancellable
objects from those
GSocketClient
s to accumulate, with one reference left each (which is
the reference from the g_cancellable_connect()
closure).
These GCancellable
instances aren’t technically leaked, as they will
all be freed when the caller’s GCancellable
is disposed, but they are
no longer useful and there is no bound on the number of them which will
hang around.
For a program doing a lot of socket operations, this still-reachable memory usage can become significant.
Fix the problem by adding paired g_cancellable_disconnect()
calls.
It’s not possible to add a unit test as we can’t measure still-reachable
memory growth before the end of a unit test when everything has to be
freed.
Signed-off-by: Philip Withnall pwithnall@endlessos.org
Fixes: #2670 (closed)
Closes #2670 (closed)