From 364981f52cf8c0210c2325ba7ab5e234242b471b Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sun, 21 Jun 2020 18:06:51 -0700 Subject: [PATCH] SwiftPrivateThreadExtras: correct misuse of API Copy out the result rather than form a dangling pointer. This fixes the incorrect usage that the compiler flags. --- .../SwiftPrivateThreadExtras.swift | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift b/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift index 906dd18880393..1b6ec49e2fbb6 100644 --- a/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift +++ b/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift @@ -117,17 +117,18 @@ public func _stdlib_thread_join( ) -> (CInt, Result?) { #if os(Windows) let result = WaitForSingleObject(thread, INFINITE) - if result == WAIT_OBJECT_0 { - var threadResult: DWORD = 0 - GetExitCodeThread(thread, &threadResult) - CloseHandle(thread) - - return (CInt(result), - UnsafeMutablePointer(&threadResult) - .withMemoryRebound(to: Result.self, capacity: 1){ $0.pointee }) - } else { - return (CInt(result), nil) + guard result == WAIT_OBJECT_0 else { return (CInt(result), nil) } + + var dwResult: DWORD = 0 + GetExitCodeThread(thread, &dwResult) + CloseHandle(thread) + + let value: Result = withUnsafePointer(to: &dwResult) { + $0.withMemoryRebound(to: Result.self, capacity: 1) { + $0.pointee + } } + return (CInt(result), value) #else var threadResultRawPtr: UnsafeMutableRawPointer? let result = pthread_join(thread, &threadResultRawPtr)