Skip to content

Commit 7d7a35e

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 16c9c00 commit 7d7a35e

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
@@ -4537,8 +4537,8 @@ WitnessTableCacheEntry::allocate(
45374537
// Find the allocation.
45384538
void **fullTable = reinterpret_cast<void**>(this + 1);
45394539

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

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

0 commit comments

Comments
 (0)