From 113a6ec5ba5e2467b936a075f169ae7a401910a2 Mon Sep 17 00:00:00 2001 From: Ronit Sabhaya Date: Fri, 30 Jan 2026 21:54:57 -0600 Subject: [PATCH] Fix file descriptor leak in DirectoryWatcher (#1104) - `DirectoryWatcher` opens file descriptors for monitoring directories but never closes them, causing a file descriptor leak. - Adds `setCancelHandler` to properly close file descriptors when the `DispatchSource` is cancelled. Signed-off-by: Ronit Sabhaya --- Sources/Helpers/APIServer/DirectoryWatcher.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sources/Helpers/APIServer/DirectoryWatcher.swift b/Sources/Helpers/APIServer/DirectoryWatcher.swift index 143bc4cd..31693221 100644 --- a/Sources/Helpers/APIServer/DirectoryWatcher.swift +++ b/Sources/Helpers/APIServer/DirectoryWatcher.swift @@ -48,13 +48,18 @@ public class DirectoryWatcher { let descriptor = open(directoryURL.path, O_EVTONLY) - source = DispatchSource.makeFileSystemObjectSource( + let dispatchSource = DispatchSource.makeFileSystemObjectSource( fileDescriptor: descriptor, eventMask: .write, queue: monitorQueue ) - source?.setEventHandler { [weak self] in + // Close the file descriptor when the source is cancelled + dispatchSource.setCancelHandler { + close(descriptor) + } + + dispatchSource.setEventHandler { [weak self] in guard let self else { return } do { @@ -65,7 +70,8 @@ public class DirectoryWatcher { } } - source?.resume() + source = dispatchSource + dispatchSource.resume() } deinit {