Skip to content

Commit 09cfb81

Browse files
committed
Fix a bug with key paths that could lead to exclusivity crashes.
1 parent 731da3b commit 09cfb81

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

stdlib/public/core/KeyPath.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2439,11 +2439,6 @@ internal func _walkKeyPathPattern<W: KeyPathPatternVisitor>(
24392439
leafAccessor: leafAccessor,
24402440
kvcCompatibilityString: kvcString)
24412441

2442-
let bufferPtr = pattern.advanced(by: keyPathPatternHeaderSize)
2443-
let bufferHeader = bufferPtr.load(as: KeyPathBuffer.Header.self)
2444-
var buffer = UnsafeRawBufferPointer(start: bufferPtr + 4,
2445-
count: bufferHeader.size)
2446-
24472442
func visitStored(header: RawKeyPathComponent.Header,
24482443
componentBuffer: inout UnsafeRawBufferPointer) {
24492444
// Decode a stored property. A small offset may be stored inline in the
@@ -2458,7 +2453,7 @@ internal func _walkKeyPathPattern<W: KeyPathPatternVisitor>(
24582453
offset = .unresolvedFieldOffset(_pop(from: &componentBuffer,
24592454
as: UInt32.self))
24602455
case RawKeyPathComponent.Header.unresolvedIndirectOffsetPayload:
2461-
let base = buffer.baseAddress.unsafelyUnwrapped
2456+
let base = componentBuffer.baseAddress.unsafelyUnwrapped
24622457
let relativeOffset = _pop(from: &componentBuffer,
24632458
as: Int32.self)
24642459
let ptr = _resolveRelativeIndirectableAddress(base, relativeOffset)
@@ -2532,6 +2527,13 @@ internal func _walkKeyPathPattern<W: KeyPathPatternVisitor>(
25322527
}
25332528
}
25342529

2530+
// We declare this down here to avoid the temptation to use it within
2531+
// the functions above.
2532+
let bufferPtr = pattern.advanced(by: keyPathPatternHeaderSize)
2533+
let bufferHeader = bufferPtr.load(as: KeyPathBuffer.Header.self)
2534+
var buffer = UnsafeRawBufferPointer(start: bufferPtr + 4,
2535+
count: bufferHeader.size)
2536+
25352537
while !buffer.isEmpty {
25362538
let header = _pop(from: &buffer,
25372539
as: RawKeyPathComponent.Header.self)

0 commit comments

Comments
 (0)