Skip to content

Commit d87221d

Browse files
committed
fix: don't reset constant handles the constructor never allocated
PerIsolateV8Constants declares 20 Persistent<String>* members but the constructor allocates 19: DEBUG_NAME_PERSISTENT is never assigned. Its destructor reset that member unconditionally, so it would have faulted on an uninitialized pointer the first time it ran -- which nothing ever did, because the object was leaked rather than deleted. Deleting it exposed the fault immediately: every worker teardown segfaulted in ~PerIsolateV8Constants. Default-initialize every member so the destructor is safe regardless of which ones the constructor populates; ResetAndDelete already skips nulls.
1 parent 6c294e4 commit d87221d

1 file changed

Lines changed: 24 additions & 21 deletions

File tree

test-app/runtime/src/main/cpp/V8StringConstants.h

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,10 @@ class V8StringConstants {
151151
~PerIsolateV8Constants() {
152152
// Persistent's traits do not reset in the destructor, so each
153153
// handle is reset explicitly (requires a live isolate) and then
154-
// freed. Generated from the member list -- keep the two in step.
154+
// freed. Every member is default-initialized because not all of
155+
// them are allocated by the constructor -- DEBUG_NAME_PERSISTENT
156+
// never is, and the previous version of this destructor reset it
157+
// unconditionally, which would have faulted had it ever run.
155158
ResetAndDelete(CLASS_IMPLEMENTATION_OBJECT_PERSISTENT);
156159
ResetAndDelete(DEBUG_NAME_PERSISTENT);
157160
ResetAndDelete(DISCARDED_ERROR_PERSISTENT);
@@ -182,26 +185,26 @@ class V8StringConstants {
182185
}
183186
}
184187

185-
v8::Persistent<v8::String>* CLASS_IMPLEMENTATION_OBJECT_PERSISTENT;
186-
v8::Persistent<v8::String>* DEBUG_NAME_PERSISTENT;
187-
v8::Persistent<v8::String>* EXTEND_PERSISTENT;
188-
v8::Persistent<v8::String>* NULL_OBJECT_PERSISTENT;
189-
v8::Persistent<v8::String>* NULL_NODE_NAME_PERSISTENT;
190-
v8::Persistent<v8::String>* IS_PROTOTYPE_IMPLEMENTATION_OBJECT_PERSISTENT;
191-
v8::Persistent<v8::String>* NATIVE_EXCEPTION_PERSISTENT;
192-
v8::Persistent<v8::String>* STACK_PERSISTENT;
193-
v8::Persistent<v8::String>* STACK_TRACE_PERSISTENT;
194-
v8::Persistent<v8::String>* LONG_NUMBER_PERSISTENT;
195-
v8::Persistent<v8::String>* PROTOTYPE_PERSISTENT;
196-
v8::Persistent<v8::String>* SUPER_PERSISTENT;
197-
v8::Persistent<v8::String>* TARGET_PERSISTENT;
198-
v8::Persistent<v8::String>* TO_STRING_PERSISTENT;
199-
v8::Persistent<v8::String>* JAVA_LONG_PERSISTENT;
200-
v8::Persistent<v8::String>* VALUE_OF_PERSISTENT;
201-
v8::Persistent<v8::String>* VALUE_PERSISTENT;
202-
v8::Persistent<v8::String>* UNCAUGHT_ERROR_PERSISTENT;
203-
v8::Persistent<v8::String>* DISCARDED_ERROR_PERSISTENT;
204-
v8::Persistent<v8::String>* IMPLEMENTATION_OBJECT_PERSISTENT;
188+
v8::Persistent<v8::String>* CLASS_IMPLEMENTATION_OBJECT_PERSISTENT = nullptr;
189+
v8::Persistent<v8::String>* DEBUG_NAME_PERSISTENT = nullptr;
190+
v8::Persistent<v8::String>* EXTEND_PERSISTENT = nullptr;
191+
v8::Persistent<v8::String>* NULL_OBJECT_PERSISTENT = nullptr;
192+
v8::Persistent<v8::String>* NULL_NODE_NAME_PERSISTENT = nullptr;
193+
v8::Persistent<v8::String>* IS_PROTOTYPE_IMPLEMENTATION_OBJECT_PERSISTENT = nullptr;
194+
v8::Persistent<v8::String>* NATIVE_EXCEPTION_PERSISTENT = nullptr;
195+
v8::Persistent<v8::String>* STACK_PERSISTENT = nullptr;
196+
v8::Persistent<v8::String>* STACK_TRACE_PERSISTENT = nullptr;
197+
v8::Persistent<v8::String>* LONG_NUMBER_PERSISTENT = nullptr;
198+
v8::Persistent<v8::String>* PROTOTYPE_PERSISTENT = nullptr;
199+
v8::Persistent<v8::String>* SUPER_PERSISTENT = nullptr;
200+
v8::Persistent<v8::String>* TARGET_PERSISTENT = nullptr;
201+
v8::Persistent<v8::String>* TO_STRING_PERSISTENT = nullptr;
202+
v8::Persistent<v8::String>* JAVA_LONG_PERSISTENT = nullptr;
203+
v8::Persistent<v8::String>* VALUE_OF_PERSISTENT = nullptr;
204+
v8::Persistent<v8::String>* VALUE_PERSISTENT = nullptr;
205+
v8::Persistent<v8::String>* UNCAUGHT_ERROR_PERSISTENT = nullptr;
206+
v8::Persistent<v8::String>* DISCARDED_ERROR_PERSISTENT = nullptr;
207+
v8::Persistent<v8::String>* IMPLEMENTATION_OBJECT_PERSISTENT = nullptr;
205208
};
206209

207210
private:

0 commit comments

Comments
 (0)