Skip to content

Commit a4b8855

Browse files
joyeecheungrdw-msft
authored andcommitted
src: fix reading empty string views in Blob[De]serializer
The string writing/reading was intended for debugging info in snapshot, which had a CHECK_GT(length, 0) check, it then got repurposed for SEA resource writing/reading and turned into a helper for string views, but was not updated to handle empty views, causing occasional crash in the CI when the read is protected. This patch fixes it. PR-URL: nodejs#52000 Fixes: nodejs#50740 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent 1ae1dab commit a4b8855

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/api/environment.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,9 @@ MaybeLocal<Value> LoadEnvironment(Environment* env,
553553
MaybeLocal<Value> LoadEnvironment(Environment* env,
554554
std::string_view main_script_source_utf8,
555555
EmbedderPreloadCallback preload) {
556-
CHECK_NOT_NULL(main_script_source_utf8.data());
556+
// It could be empty when it's used by SEA to load an empty script.
557+
CHECK_IMPLIES(main_script_source_utf8.size() > 0,
558+
main_script_source_utf8.data());
557559
return LoadEnvironment(
558560
env,
559561
[&](const StartExecutionCallbackInfo& info) -> MaybeLocal<Value> {

src/blob_serializer_deserializer-inl.h

+9
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ std::string_view BlobDeserializer<Impl>::ReadStringView(StringLogMode mode) {
139139
size_t length = ReadArithmetic<size_t>();
140140
Debug("ReadStringView(), length=%zu: ", length);
141141

142+
if (length == 0) {
143+
Debug("ReadStringView() read an empty view\n");
144+
return std::string_view();
145+
}
146+
142147
std::string_view result(sink.data() + read_total, length);
143148
Debug("%p, read %zu bytes", result.data(), result.size());
144149
if (mode == StringLogMode::kAddressAndContent) {
@@ -269,6 +274,10 @@ size_t BlobSerializer<Impl>::WriteStringView(std::string_view data,
269274
size_t written_total = WriteArithmetic<size_t>(data.size());
270275

271276
size_t length = data.size();
277+
if (length == 0) {
278+
Debug("WriteStringView() wrote an empty view\n");
279+
return written_total;
280+
}
272281
sink.insert(sink.end(), data.data(), data.data() + length);
273282
written_total += length;
274283

0 commit comments

Comments
 (0)