Skip to content

Commit 3d6382f

Browse files
authored
Merge pull request #63999 from Azoy/sign-type-descriptor
[Reflection] Sign type descriptor and access function
2 parents 7ba396a + 12aa9ce commit 3d6382f

File tree

3 files changed

+115
-8
lines changed

3 files changed

+115
-8
lines changed

stdlib/public/Reflection/Sources/_Runtime/Metadata/MetadataAccessFunction.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ extension Metadata {
3737
@available(SwiftStdlib 5.9, *)
3838
@inlinable
3939
public func callAsFunction(_ request: Request) -> Metadata {
40-
let fn = unsafeBitCast(ptr, to: AccessFn0.self)
40+
let signedPtr = PtrAuth.signAccessFn0(ptr)
41+
let fn = unsafeBitCast(signedPtr, to: AccessFn0.self)
4142

4243
return fn(request).metadata
4344
}
@@ -76,7 +77,8 @@ extension Metadata {
7677
_ request: Request,
7778
_ arg0: UnsafeRawPointer
7879
) -> Metadata {
79-
let fn = unsafeBitCast(ptr, to: AccessFn1.self)
80+
let signedPtr = PtrAuth.signAccessFn1(ptr)
81+
let fn = unsafeBitCast(signedPtr, to: AccessFn1.self)
8082

8183
return fn(request, arg0).metadata
8284
}
@@ -119,7 +121,8 @@ extension Metadata {
119121
_ arg0: UnsafeRawPointer,
120122
_ arg1: UnsafeRawPointer
121123
) -> Metadata {
122-
let fn = unsafeBitCast(ptr, to: AccessFn2.self)
124+
let signedPtr = PtrAuth.signAccessFn2(ptr)
125+
let fn = unsafeBitCast(signedPtr, to: AccessFn2.self)
123126

124127
return fn(request, arg0, arg1).metadata
125128
}
@@ -166,7 +169,8 @@ extension Metadata {
166169
_ arg1: UnsafeRawPointer,
167170
_ arg2: UnsafeRawPointer
168171
) -> Metadata {
169-
let fn = unsafeBitCast(ptr, to: AccessFn3.self)
172+
let signedPtr = PtrAuth.signAccessFn3(ptr)
173+
let fn = unsafeBitCast(signedPtr, to: AccessFn3.self)
170174

171175
return fn(request, arg0, arg1, arg2).metadata
172176
}
@@ -187,7 +191,8 @@ extension Metadata {
187191
_ request: Request,
188192
_ args: [any Any.Type]
189193
) -> Metadata {
190-
let fn = unsafeBitCast(ptr, to: AccessFnMany.self)
194+
let signedPtr = PtrAuth.signAccessFnMany(ptr)
195+
let fn = unsafeBitCast(signedPtr, to: AccessFnMany.self)
191196

192197
return args.withUnsafeBufferPointer {
193198
fn(
@@ -205,7 +210,8 @@ extension Metadata {
205210
_ request: Request,
206211
_ args: [Metadata]
207212
) -> Metadata {
208-
let fn = unsafeBitCast(ptr, to: AccessFnMany.self)
213+
let signedPtr = PtrAuth.signAccessFnMany(ptr)
214+
let fn = unsafeBitCast(signedPtr, to: AccessFnMany.self)
209215

210216
return args.withUnsafeBufferPointer {
211217
fn(
@@ -234,7 +240,8 @@ extension Metadata {
234240
_ request: Request,
235241
_ args: UnsafeBufferPointer<UnsafeRawPointer>
236242
) -> Metadata {
237-
let fn = unsafeBitCast(ptr, to: AccessFnMany.self)
243+
let signedPtr = PtrAuth.signAccessFnMany(ptr)
244+
let fn = unsafeBitCast(signedPtr, to: AccessFnMany.self)
238245

239246
return fn(request, args.baseAddress.unsafelyUnwrapped).metadata
240247
}

stdlib/public/Reflection/Sources/_Runtime/Metadata/TypeMetadata.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ extension TypeMetadata {
4242

4343
address = address.unprotectedLoad(as: UnsafeRawPointer.self)
4444

45-
return TypeDescriptor(address)
45+
return PtrAuth.signDescriptor(TypeDescriptor(address))
4646
}
4747

4848
@inlinable

stdlib/public/Reflection/Sources/_Runtime/Utils/PtrAuth.swift

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,76 @@ extension PtrAuth {
191191

192192
return Metadata(signedBitPattern.rawPointer)
193193
}
194+
195+
@available(SwiftStdlib 5.9, *)
196+
@inlinable
197+
static func signAccessFn0(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
198+
let signedBitPattern = UInt64(Builtin.int_ptrauth_sign(
199+
fnPtr.bitPattern._value,
200+
Key.processIndependentCode._value,
201+
UInt64(Builtin.typePtrAuthDiscriminator(
202+
Metadata.AccessFunction.AccessFn0.self
203+
))
204+
))
205+
206+
return signedBitPattern.rawPointer
207+
}
208+
209+
@available(SwiftStdlib 5.9, *)
210+
@inlinable
211+
static func signAccessFn1(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
212+
let signedBitPattern = UInt64(Builtin.int_ptrauth_sign(
213+
fnPtr.bitPattern._value,
214+
Key.processIndependentCode._value,
215+
UInt64(Builtin.typePtrAuthDiscriminator(
216+
Metadata.AccessFunction.AccessFn1.self
217+
))
218+
))
219+
220+
return signedBitPattern.rawPointer
221+
}
222+
223+
@available(SwiftStdlib 5.9, *)
224+
@inlinable
225+
static func signAccessFn2(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
226+
let signedBitPattern = UInt64(Builtin.int_ptrauth_sign(
227+
fnPtr.bitPattern._value,
228+
Key.processIndependentCode._value,
229+
UInt64(Builtin.typePtrAuthDiscriminator(
230+
Metadata.AccessFunction.AccessFn2.self
231+
))
232+
))
233+
234+
return signedBitPattern.rawPointer
235+
}
236+
237+
@available(SwiftStdlib 5.9, *)
238+
@inlinable
239+
static func signAccessFn3(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
240+
let signedBitPattern = UInt64(Builtin.int_ptrauth_sign(
241+
fnPtr.bitPattern._value,
242+
Key.processIndependentCode._value,
243+
UInt64(Builtin.typePtrAuthDiscriminator(
244+
Metadata.AccessFunction.AccessFn3.self
245+
))
246+
))
247+
248+
return signedBitPattern.rawPointer
249+
}
250+
251+
@available(SwiftStdlib 5.9, *)
252+
@inlinable
253+
static func signAccessFnMany(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
254+
let signedBitPattern = UInt64(Builtin.int_ptrauth_sign(
255+
fnPtr.bitPattern._value,
256+
Key.processIndependentCode._value,
257+
UInt64(Builtin.typePtrAuthDiscriminator(
258+
Metadata.AccessFunction.AccessFnMany.self
259+
))
260+
))
261+
262+
return signedBitPattern.rawPointer
263+
}
194264
#else
195265
@available(SwiftStdlib 5.9, *)
196266
@inlinable
@@ -217,6 +287,36 @@ extension PtrAuth {
217287
static func signSuperclass(_ superclass: Metadata) -> Metadata {
218288
superclass
219289
}
290+
291+
@available(SwiftStdlib 5.9, *)
292+
@inlinable
293+
static func signAccessFn0(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
294+
fnPtr
295+
}
296+
297+
@available(SwiftStdlib 5.9, *)
298+
@inlinable
299+
static func signAccessFn1(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
300+
fnPtr
301+
}
302+
303+
@available(SwiftStdlib 5.9, *)
304+
@inlinable
305+
static func signAccessFn2(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
306+
fnPtr
307+
}
308+
309+
@available(SwiftStdlib 5.9, *)
310+
@inlinable
311+
static func signAccessFn3(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
312+
fnPtr
313+
}
314+
315+
@available(SwiftStdlib 5.9, *)
316+
@inlinable
317+
static func signAccessFnMany(_ fnPtr: UnsafeRawPointer) -> UnsafeRawPointer {
318+
fnPtr
319+
}
220320
#endif
221321
}
222322

0 commit comments

Comments
 (0)