From a1845e765904e6511ba089991f9f275403c26619 Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Mon, 16 Feb 2026 12:34:03 +0100 Subject: [PATCH 1/2] attempt to fix more crashes in archive --- Plugins/AWSLambdaPackager/PluginUtils.swift | 27 ++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Plugins/AWSLambdaPackager/PluginUtils.swift b/Plugins/AWSLambdaPackager/PluginUtils.swift index 02f48bc8..aa8697aa 100644 --- a/Plugins/AWSLambdaPackager/PluginUtils.swift +++ b/Plugins/AWSLambdaPackager/PluginUtils.swift @@ -80,9 +80,6 @@ struct Utils { } let pipe = Pipe() - pipe.fileHandleForReading.readabilityHandler = { fileHandle in - outputQueue.async { outputHandler(fileHandle.availableData) } - } let process = Process() process.standardOutput = pipe @@ -93,17 +90,25 @@ struct Utils { process.currentDirectoryURL = URL(fileURLWithPath: customWorkingDirectory.path()) } + // Read from the pipe on a background thread using a manual read loop. + // We avoid FileHandle.readabilityHandler because on Linux its setter + // triggers _bridgeAnythingToObjectiveC / swift_dynamicCast which can + // crash with a SIGSEGV during concurrent Swift runtime metadata resolution. + let readFileHandle = pipe.fileHandleForReading + outputQueue.async { + // Read in a loop until EOF + while true { + let data = readFileHandle.availableData + if data.isEmpty { + break // EOF + } + outputHandler(data) + } + } + try process.run() process.waitUntilExit() - // Stop the readability handler before reading remaining data to avoid - // a race between the handler and readToEnd() on Linux, which can cause - // a SIGSEGV in the Swift runtime's metadata resolution. - pipe.fileHandleForReading.readabilityHandler = nil - - // Read any remaining data from the pipe - outputQueue.async { outputHandler(try? pipe.fileHandleForReading.readToEnd()) } - // wait for output to be fully processed outputSync.wait() From 20424889b75bcd7abecc391dc464fdb08514b56e Mon Sep 17 00:00:00 2001 From: Sebastien Stormacq Date: Mon, 16 Feb 2026 13:20:29 +0100 Subject: [PATCH 2/2] fix a potential race condition --- Plugins/AWSLambdaPackager/PluginUtils.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugins/AWSLambdaPackager/PluginUtils.swift b/Plugins/AWSLambdaPackager/PluginUtils.swift index aa8697aa..8cb7e22e 100644 --- a/Plugins/AWSLambdaPackager/PluginUtils.swift +++ b/Plugins/AWSLambdaPackager/PluginUtils.swift @@ -95,7 +95,9 @@ struct Utils { // triggers _bridgeAnythingToObjectiveC / swift_dynamicCast which can // crash with a SIGSEGV during concurrent Swift runtime metadata resolution. let readFileHandle = pipe.fileHandleForReading + outputSync.enter() outputQueue.async { + defer { outputSync.leave() } // Read in a loop until EOF while true { let data = readFileHandle.availableData