Skip to content

Commit 0f1439c

Browse files
committed
[Runtime] Zero out the entire witness table during instantiation.
During witness table instantiation, the witness table is constructed several sources: the pattern, the resilient witnesses, the private data, and default implementations. The private data area is the only one that was being zeroed out; the rest we rely on always filling in the data from the conformance descriptor and provided info. However, witness table instantiation uses the presence of a NULL pointer for a particular witness in the resulting table to indicate that no witness fulfilled that requirement, so that it can fill in the default witnesss. Except that, without zeroing that part of the table beforehand, we aren't guaranteed to have a NULL pointer for witness entries that the client (protocol conformance) did not know about at the time it was compiled. Zero out the entire witness table so default implementations can be filled in appropriately. Fixes rdar://problem/64295849.
1 parent 3e13ca6 commit 0f1439c

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4536,8 +4536,8 @@ WitnessTableCacheEntry::allocate(
45364536
// Find the allocation.
45374537
void **fullTable = reinterpret_cast<void**>(this + 1);
45384538

4539-
// Zero out the private storage area.
4540-
memset(fullTable, 0, privateSizeInWords * sizeof(void*));
4539+
// Zero out the witness table.
4540+
memset(fullTable, 0, getWitnessTableSize(conformance));
45414541

45424542
// Advance the address point; the private storage area is accessed via
45434543
// negative offsets.

0 commit comments

Comments
 (0)