aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/nfs/Connection.hxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-12-14 15:56:53 +0100
committerMax Kellermann <max@duempel.org>2014-12-14 16:02:47 +0100
commita543627abd19f321ddd4259e222e6437e8312417 (patch)
tree9a0494216cc13a0785d972f762c556c0718e3335 /src/lib/nfs/Connection.hxx
parent80f2ba7fca533de38575bdaf737ea89284ed2b7b (diff)
downloadmpd-a543627abd19f321ddd4259e222e6437e8312417.tar.gz
mpd-a543627abd19f321ddd4259e222e6437e8312417.tar.xz
mpd-a543627abd19f321ddd4259e222e6437e8312417.zip
lib/nfs/Connection: fix memory leak (and assertion failure)
nfs_destroy_context() will invoke all pending callbacks with err==-EINTR. In CancellableCallback::Callback(), this will invoke NfsConnection::DeferClose(), which however is only designed to be called from nfs_service(). In non-debug mode, this will leak memory because nfs_close_async() is never called. Workaround: before nfs_destroy_context(), invoke nfs_close_async() on all pending file handles.
Diffstat (limited to 'src/lib/nfs/Connection.hxx')
-rw-r--r--src/lib/nfs/Connection.hxx7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/lib/nfs/Connection.hxx b/src/lib/nfs/Connection.hxx
index 3d872eb3a..e47ba404b 100644
--- a/src/lib/nfs/Connection.hxx
+++ b/src/lib/nfs/Connection.hxx
@@ -84,6 +84,13 @@ class NfsConnection : SocketMonitor, DeferredMonitor {
*/
void CancelAndScheduleClose(struct nfsfh *fh);
+ /**
+ * Called by NfsConnection::DestroyContext() right
+ * before nfs_destroy_context(). This object is given
+ * a chance to prepare for the latter.
+ */
+ void PrepareDestroyContext();
+
private:
static void Callback(int err, struct nfs_context *nfs,
void *data, void *private_data);