Skip to content

Commit aa84b93

Browse files
committed
[Reflection] Bounds-check vector creation in createBoundGenericTypeReconstructingParent.
If argsIndex or numGenericsArgs were out of bounds, we'd end up reading off the beginning or end of the args ArrayRef, resulting in memory allocation failures, segfaults, or reading garbage data. Check that we're reading within the bounds of the array, and fail gracefully if not. rdar://103142856
1 parent 7acbf55 commit aa84b93

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,13 @@ class TypeRefBuilder {
571571

572572
auto numGenericArgs = genericParamsPerLevel[shapeIndex];
573573

574+
auto startOffsetFromEnd = argsIndex + numGenericArgs;
575+
auto endOffsetFromEnd = argsIndex;
576+
if (startOffsetFromEnd > args.size() || endOffsetFromEnd > args.size())
577+
return nullptr;
578+
574579
std::vector<const TypeRef *> genericParams(
575-
args.end() - argsIndex - numGenericArgs, args.end() - argsIndex);
580+
args.end() - startOffsetFromEnd, args.end() - endOffsetFromEnd);
576581

577582
const BoundGenericTypeRef *parent = nullptr;
578583
if (node->hasChildren()) {

0 commit comments

Comments
 (0)