From c92ac1a71e6a89f4a53da4f86b53837e9aa23269 Mon Sep 17 00:00:00 2001 From: Serhii Hadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com> Date: Tue, 24 May 2022 14:36:06 +0300 Subject: [PATCH] SYNERGY1-1497 Fix memory leak on macOS (#7178) * SYNERGY1-1497 Fix memory leak on macOS * Update ChangeLog * Fix Fedora build --- .github/workflows/job-test-linux-fedora.yml | 6 ++++++ ChangeLog | 2 +- src/lib/client/Client.cpp | 2 +- src/lib/platform/OSXDragSimulator.m | 5 ++++- src/lib/platform/OSXScreen.h | 3 ++- src/lib/platform/OSXScreen.mm | 10 +++++----- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/job-test-linux-fedora.yml b/.github/workflows/job-test-linux-fedora.yml index 01a0fc050..b449d86cf 100644 --- a/.github/workflows/job-test-linux-fedora.yml +++ b/.github/workflows/job-test-linux-fedora.yml @@ -25,6 +25,12 @@ jobs: steps: - uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Work around https://github.com/actions/checkout/issues/766 + run: | + git config --global --add safe.directory "$GITHUB_WORKSPACE" - name: Build run: | diff --git a/ChangeLog b/ChangeLog index 5ef6d588b..b98ea3cee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,7 +10,7 @@ Bug fixes: - #7149 Address issues with modifiers and dead keys - #7163 Fix compilation issues for FreeBSD - #7172 Memory leaks in language sync and TLS functionality -- #7175 Memory leaks in copy/paste and drag and drop functionality +- #7175 | #7178 Memory leaks in copy/paste and drag and drop functionality Github Actions: - #7148 Fix unstable build for windows core diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index 911999777..1fa4fb517 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -814,7 +814,7 @@ Client::handleResume(const Event&, void*) void Client::handleFileChunkSending(const Event& event, void*) { - sendFileChunk(event.getData()); + sendFileChunk(event.getDataObject()); } void diff --git a/src/lib/platform/OSXDragSimulator.m b/src/lib/platform/OSXDragSimulator.m index 333abd005..53e619dde 100644 --- a/src/lib/platform/OSXDragSimulator.m +++ b/src/lib/platform/OSXDragSimulator.m @@ -86,8 +86,11 @@ fakeDragging(const char* str, int cursorX, int cursorY) [g_dragView setFileExt:g_ext]; - CGEventRef down = CGEventCreateMouseEvent(CGEventSourceCreate(kCGEventSourceStateHIDSystemState), kCGEventLeftMouseDown, CGPointMake(cursorX, cursorY), kCGMouseButtonLeft); + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef down = CGEventCreateMouseEvent(source, kCGEventLeftMouseDown, CGPointMake(cursorX, cursorY), kCGMouseButtonLeft); CGEventPost(kCGHIDEventTap, down); + CFRelease(down); + CFRelease(source); }); } diff --git a/src/lib/platform/OSXScreen.h b/src/lib/platform/OSXScreen.h index ecfef6507..432100f41 100644 --- a/src/lib/platform/OSXScreen.h +++ b/src/lib/platform/OSXScreen.h @@ -32,6 +32,7 @@ #include #include #include +#include extern "C" { typedef int CGSConnectionID; @@ -336,7 +337,7 @@ private: IEventQueue* m_events; - Thread* m_getDropTargetThread; + std::unique_ptr m_getDropTargetThread; String m_dropTarget; #if defined(MAC_OS_X_VERSION_10_7) diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm index 94dac36ab..a8a258d46 100644 --- a/src/lib/platform/OSXScreen.mm +++ b/src/lib/platform/OSXScreen.mm @@ -117,7 +117,7 @@ OSXScreen::OSXScreen(IEventQueue* events, m_lastSingleClickXCursor(0), m_lastSingleClickYCursor(0), m_events(events), - m_getDropTargetThread(NULL), + m_getDropTargetThread(nullptr), m_impl(NULL) { m_displayID = CGMainDisplayID(); @@ -602,8 +602,8 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press) if (!press && (id == kButtonLeft)) { if (m_fakeDraggingStarted) { - m_getDropTargetThread = new Thread(new TMethodJob( - this, &OSXScreen::getDropTargetThread)); + auto method = new TMethodJob(this, &OSXScreen::getDropTargetThread); + m_getDropTargetThread.reset(new Thread(method)); } m_draggingStarted = false; @@ -1206,8 +1206,8 @@ OSXScreen::onMouseButton(bool pressed, UInt16 macButton) } else { if (m_fakeDraggingStarted) { - m_getDropTargetThread = new Thread(new TMethodJob( - this, &OSXScreen::getDropTargetThread)); + auto method = new TMethodJob(this, &OSXScreen::getDropTargetThread); + m_getDropTargetThread.reset(new Thread(method)); } m_draggingStarted = false;