From c0c4841c24fa82f42871c4c424c62ea8af2b26d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 9 Dec 2008 22:23:36 +0000 Subject: [PATCH] While looking at the code, I found two memory leaks: * UpdateUserListener() did not delete the copiedListener in case adding the monitor listener failed. * RemoveListener() did never delete UserNodeListeners, IOW user node monitors were never freed! git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28787 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/fs/node_monitor.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/fs/node_monitor.cpp b/src/system/kernel/fs/node_monitor.cpp index b8e648b428..b2935e7f90 100644 --- a/src/system/kernel/fs/node_monitor.cpp +++ b/src/system/kernel/fs/node_monitor.cpp @@ -268,6 +268,12 @@ NodeMonitorService::_RemoveListener(monitor_listener *listener) monitor->listeners.Remove(listener); list_remove_link(listener); + if (dynamic_cast(listener->listener) != NULL) { + // This is a listener we copied ourselves in UpdateUserListener(), + // so we have to delete it here. + delete listener->listener; + } + delete listener; if (monitor->listeners.IsEmpty()) @@ -907,7 +913,12 @@ NodeMonitorService::UpdateUserListener(io_context *context, dev_t device, return B_NO_MEMORY; } - return _AddMonitorListener(context, monitor, flags, *copiedListener); + status_t status = _AddMonitorListener(context, monitor, flags, + *copiedListener); + if (status != B_OK) + delete copiedListener; + + return status; }