Skip to content

Commit 584beaa

Browse files
joyeecheungmarco-ippolito
authored andcommittedAug 19, 2024
src: zero-initialize data that are copied into the snapshot
To prevent padding from making the snapshot unreproducible, zero-initialize the data that are copied into the snapshot so that the padding copied are all zeros. This is better than enlarging the enums to align the fields since it doesn't make the snapshot bigger than necessary, and it removes the need of using static assertions to ensure alignment. PR-URL: #53563 Refs: #50983 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Daniel Lemire <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 229f7f8 commit 584beaa

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed
 

‎src/node_snapshotable.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -1357,9 +1357,11 @@ StartupData SerializeNodeContextInternalFields(Local<Object> holder,
13571357
// To serialize the type field, save data in a EmbedderTypeInfo.
13581358
if (index == BaseObject::kEmbedderType) {
13591359
int size = sizeof(EmbedderTypeInfo);
1360-
char* data = new char[size];
13611360
// We need to use placement new because V8 calls delete[] on the returned
13621361
// data.
1362+
// The () syntax at the end would zero-initialize the block and make
1363+
// the padding reproducible.
1364+
char* data = new char[size]();
13631365
// TODO(joyeecheung): support cppgc objects.
13641366
new (data) EmbedderTypeInfo(obj->type(),
13651367
EmbedderTypeInfo::MemoryMode::kBaseObject);

‎src/node_snapshotable.h

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct InternalFieldInfoBase {
4747
std::is_same_v<InternalFieldInfoBase, T>,
4848
"Can only accept InternalFieldInfoBase subclasses");
4949
void* buf = ::operator new[](sizeof(T));
50+
memset(buf, 0, sizeof(T)); // Make the padding reproducible.
5051
T* result = new (buf) T;
5152
result->type = type;
5253
result->length = sizeof(T);

0 commit comments

Comments
 (0)