[PATCH] Fix Wireguard-Apple Logger Memory Leak (Fix Wireguard-Apple Logger Memory Leak)

roy azachi royaza1998 at gmail.com
Sun Apr 24 09:19:50 UTC 2022


Using "Instruments" tool shows every log message from the
SystemExtension creates a persistent allocation. Although it seems
there is no retain cycle, the allocated resources are not freed, which
might be caused by the way the function is invoked using golang
instead of the usual swift invocation freeing allocations with zero
retain counter . Using the "autoreleasepool" seems to solve it.
the call tree not freed:
  12 WireGuardNetworkExtension     runtime.asmcgocall.abi0
  11 WireGuardNetworkExtension     _cgo_f1100e4bfc6f_Cfunc_callLogger
  10 WireGuardNetworkExtension     callLogger
   9 WireGuardNetworkExtension     @objc closure #1 in
WireGuardAdapter.setupLogHandler()
<reducted>/wireguard-apple/<compiler-generated>:0
   8 WireGuardNetworkExtension     closure #1 in
WireGuardAdapter.setupLogHandler()
<reducted>/wireguard-apple/Sources/WireGuardKit/WireGuardAdapter.swift:299
   7 libswiftCore.dylib      specialized static String._fromUTF8Repairing(_:)
   6 libswiftCore.dylib      specialized static
String._uncheckedFromUTF8(_:asciiPreScanResult:)
   5 libswiftCore.dylib      specialized static
__StringStorage.create(initializingFrom:isASCII:)
   4 libswiftCore.dylib      _allocateStringStorage(codeUnitCapacity:)
   3 libswiftCore.dylib      _swift_allocObject_
   2 libswiftCore.dylib      _swift_allocObject_
   1 libswiftCore.dylib      swift_slowAlloc
   0 libsystem_malloc.dylib      _malloc_zone_malloc

Signed-off-by: Roy Azachi <royaza1998 at gmail.com>
---
 Sources/WireGuardKit/WireGuardAdapter.swift | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/Sources/WireGuardKit/WireGuardAdapter.swift
b/Sources/WireGuardKit/WireGuardAdapter.swift
index 4cb2e2e..3828951 100644
--- a/Sources/WireGuardKit/WireGuardAdapter.swift
+++ b/Sources/WireGuardKit/WireGuardAdapter.swift
@@ -295,11 +295,12 @@ public class WireGuardAdapter {

             let unretainedSelf =
Unmanaged<WireGuardAdapter>.fromOpaque(context)
                 .takeUnretainedValue()
+            autoreleasepool {
+                let swiftString = String(cString:
message).trimmingCharacters(in: .newlines)
+                let tunnelLogLevel = WireGuardLogLevel(rawValue:
logLevel) ?? .verbose

-            let swiftString = String(cString:
message).trimmingCharacters(in: .newlines)
-            let tunnelLogLevel = WireGuardLogLevel(rawValue:
logLevel) ?? .verbose
-
-            unretainedSelf.logHandler(tunnelLogLevel, swiftString)
+                unretainedSelf.logHandler(tunnelLogLevel, swiftString)
+            }
         }
     }

--
2.30.1 (Apple Git-130)


More information about the WireGuard mailing list