mirror of https://github.com/nodejs/node.git
deps: V8: cherry-pick e0a109c
Original commit message:
[api] Implement StartupData::CanBeRehashed() for the snapshot blob
This enables the embedder to check if the snapshot generated
from SnapshotCreator::CreateBlob() can be rehashed and the seed
can be recomputed during deserialization.
The lack of this functionality resulted in a temporary vunerability
in Node.js: https://github.com/nodejs/node/pull/27365
Change-Id: I88d52337217c40f79c26438be3c87d2db874d980
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1578661
Commit-Queue: Joyee Cheung <joyee@igalia.com>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#61175}
Refs: e0a109c058
PR-URL: https://github.com/nodejs/node/pull/27533
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Refael Ackermann (רפאל פלחי) <refack@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
pull/28071/head
parent
58fc168807
commit
d2634be562
|
@ -38,7 +38,7 @@
|
|||
|
||||
# Reset this number to 0 on major V8 upgrades.
|
||||
# Increment by one for each non-official patch applied to deps/v8.
|
||||
'v8_embedder_string': '-node.13',
|
||||
'v8_embedder_string': '-node.14',
|
||||
|
||||
##### V8 defaults for Node.js #####
|
||||
|
||||
|
|
|
@ -8609,6 +8609,13 @@ class V8_EXPORT Isolate {
|
|||
|
||||
class V8_EXPORT StartupData {
|
||||
public:
|
||||
/**
|
||||
* Whether the data created can be rehashed and and the hash seed can be
|
||||
* recomputed when deserialized.
|
||||
* Only valid for StartupData returned by SnapshotCreator::CreateBlob().
|
||||
*/
|
||||
bool CanBeRehashed() const;
|
||||
|
||||
const char* data;
|
||||
int raw_size;
|
||||
};
|
||||
|
|
|
@ -887,6 +887,11 @@ StartupData SnapshotCreator::CreateBlob(
|
|||
return result;
|
||||
}
|
||||
|
||||
bool StartupData::CanBeRehashed() const {
|
||||
DCHECK(i::Snapshot::VerifyChecksum(this));
|
||||
return i::Snapshot::ExtractRehashability(this);
|
||||
}
|
||||
|
||||
void V8::SetDcheckErrorHandler(DcheckErrorCallback that) {
|
||||
v8::base::SetDcheckFunction(that);
|
||||
}
|
||||
|
|
|
@ -229,7 +229,9 @@ uint32_t Snapshot::ExtractContextOffset(const v8::StartupData* data,
|
|||
|
||||
bool Snapshot::ExtractRehashability(const v8::StartupData* data) {
|
||||
CHECK_LT(kRehashabilityOffset, static_cast<uint32_t>(data->raw_size));
|
||||
return GetHeaderValue(data, kRehashabilityOffset) != 0;
|
||||
uint32_t rehashability = GetHeaderValue(data, kRehashabilityOffset);
|
||||
CHECK_IMPLIES(rehashability != 0, rehashability == 1);
|
||||
return rehashability != 0;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
|
|
@ -87,11 +87,12 @@ class Snapshot : public AllStatic {
|
|||
static bool SnapshotIsValid(const v8::StartupData* snapshot_blob);
|
||||
#endif // DEBUG
|
||||
|
||||
static bool ExtractRehashability(const v8::StartupData* data);
|
||||
|
||||
private:
|
||||
static uint32_t ExtractNumContexts(const v8::StartupData* data);
|
||||
static uint32_t ExtractContextOffset(const v8::StartupData* data,
|
||||
uint32_t index);
|
||||
static bool ExtractRehashability(const v8::StartupData* data);
|
||||
static Vector<const byte> ExtractStartupData(const v8::StartupData* data);
|
||||
static Vector<const byte> ExtractReadOnlyData(const v8::StartupData* data);
|
||||
static Vector<const byte> ExtractContextData(const v8::StartupData* data,
|
||||
|
|
|
@ -3709,6 +3709,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedNotRehashable) {
|
|||
}
|
||||
blob =
|
||||
creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear);
|
||||
CHECK(!blob.CanBeRehashed());
|
||||
}
|
||||
|
||||
i::FLAG_hash_seed = 1337;
|
||||
|
@ -3774,6 +3775,7 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) {
|
|||
}
|
||||
blob =
|
||||
creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear);
|
||||
CHECK(blob.CanBeRehashed());
|
||||
}
|
||||
|
||||
i::FLAG_hash_seed = 1337;
|
||||
|
|
Loading…
Reference in New Issue