Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit ec0a83e

Browse files
authored
Fix OpenSSL stack pointer handling and CFError -> NSError casting in certificates.swift
1 parent 82f0ea9 commit ec0a83e

1 file changed

Lines changed: 16 additions & 13 deletions

File tree

Sources/prostore/certificates/certificates.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ public final class CertificatesManager {
3737
var cfErr: Unmanaged<CFError>?
3838
guard let keyData = SecKeyCopyExternalRepresentation(secKey, &cfErr) as Data? else {
3939
if let cfError = cfErr?.takeRetainedValue() {
40-
// Safely cast CFError -> NSError if possible, otherwise fallback to -1
41-
let nsError = cfError as? NSError
42-
throw CertificateError.publicKeyExportFailed(OSStatus(nsError?.code ?? -1))
40+
// Bridge CFError -> NSError safely and extract code (fallback -1)
41+
let nsError = cfError as NSError
42+
throw CertificateError.publicKeyExportFailed(OSStatus(nsError.code))
4343
} else {
4444
throw CertificateError.publicKeyExportFailed(-1)
4545
}
@@ -68,19 +68,20 @@ public final class CertificatesManager {
6868
}
6969
defer { PKCS7_free(p7) }
7070

71-
// Get signers (stack of X509). PKCS7_get0_signers often returns a newly allocated stack pointer.
71+
// Get signers (stack of X509). PKCS7_get0_signers often returns an allocated stack pointer.
7272
guard let signers = PKCS7_get0_signers(p7, nil, 0) else {
7373
throw CertificateError.noCertsInProvision
7474
}
7575

76-
// Use OPENSSL_sk_* helpers (macros may be unavailable)
77-
let rawStackPtr = UnsafeMutableRawPointer(signers)
78-
let count = Int(OPENSSL_sk_num(rawStackPtr))
76+
// Cast the returned stack pointer to OpaquePointer for OPENSSL_sk_* calls
77+
let stackPtr = OpaquePointer(signers)
78+
79+
// Use OPENSSL_sk_num and OPENSSL_sk_value with proper index types
80+
let count = Int(OPENSSL_sk_num(stackPtr))
7981
for i in 0..<count {
80-
// OPENSSL_sk_value returns UnsafeMutableRawPointer?
81-
guard let val = OPENSSL_sk_value(rawStackPtr, i) else { continue }
82-
// Interpret the pointer as X509*
83-
let x509Ptr = val.assumingMemoryBound(to: X509.self)
82+
guard let rawVal = OPENSSL_sk_value(stackPtr, Int32(i)) else { continue }
83+
// rawVal is UnsafeMutableRawPointer; interpret as X509*
84+
let x509Ptr = rawVal.assumingMemoryBound(to: X509.self)
8485

8586
// convert X509 -> DER
8687
var derPtr: UnsafeMutablePointer<UInt8>? = nil
@@ -100,8 +101,10 @@ public final class CertificatesManager {
100101
}
101102
}
102103

103-
// free the signers stack
104-
OPENSSL_sk_pop_free(rawStackPtr, X509_free)
104+
// free the signers stack using OPENSSL_sk_pop_free and provide X509_free as the free func.
105+
// Need to cast X509_free to the expected C function pointer type.
106+
let freeFunc = unsafeBitCast(X509_free, to: (@convention(c) (UnsafeMutableRawPointer?) -> Void).self)
107+
OPENSSL_sk_pop_free(stackPtr, freeFunc)
105108

106109
guard certs.count > 0 else { throw CertificateError.noCertsInProvision }
107110
return certs

0 commit comments

Comments
 (0)