diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-03-15 22:58:28 +0100 |
---|---|---|
committer | Refael Ackermann <refack@gmail.com> | 2019-03-28 16:37:31 -0400 |
commit | bf572c7831fd121701c5571371ccd5ff7514c42c (patch) | |
tree | fda98b5752e91388eb2dc1af5b44aaab1103f23f /deps/v8/src/builtins | |
parent | 09f134fccf605476e0a0b8df01164946c5b1236a (diff) | |
download | android-node-v8-bf572c7831fd121701c5571371ccd5ff7514c42c.tar.gz android-node-v8-bf572c7831fd121701c5571371ccd5ff7514c42c.tar.bz2 android-node-v8-bf572c7831fd121701c5571371ccd5ff7514c42c.zip |
deps: V8: cherry-pick 91f0cd0
Original commit message:
[ubsan] Fix various ClusterFuzz-found issues
Fixing a few float and int overflows.
Drive-by fix: with --experimental-wasm-bigint, Number values
may not be used to initialize i64-typed globals. The existing
code for doing that relied on UB; since it's a spec violation
the fix is to throw instead.
No regression test for 933103 because it will OOM anyway.
No regression test for 932896 because it would be extremely slow.
Bug: chromium:927894, chromium:927996, chromium:930086, chromium:932679, chromium:932896, chromium:933103, chromium:933134
Change-Id: Iae1c1ff1038af4512a52d3e56b8c4b75f2233314
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1495911
Commit-Queue: Jakob Kummerow <jkummerow@chromium.org>
Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#60075}
Refs: https://github.com/v8/v8/commit/91f0cd00820a6e8d4567c1ce3a51d48a28165ab5
PR-URL: https://github.com/nodejs/node/pull/26685
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Diffstat (limited to 'deps/v8/src/builtins')
-rw-r--r-- | deps/v8/src/builtins/builtins-string.cc | 7 | ||||
-rw-r--r-- | deps/v8/src/builtins/builtins-typed-array.cc | 19 |
2 files changed, 14 insertions, 12 deletions
diff --git a/deps/v8/src/builtins/builtins-string.cc b/deps/v8/src/builtins/builtins-string.cc index d114a0e86b..43edd628d7 100644 --- a/deps/v8/src/builtins/builtins-string.cc +++ b/deps/v8/src/builtins/builtins-string.cc @@ -448,7 +448,12 @@ BUILTIN(StringRaw) { Object::ToLength(isolate, raw_len)); IncrementalStringBuilder result_builder(isolate); - const uint32_t length = static_cast<uint32_t>(raw_len->Number()); + // Intentional spec violation: we ignore {length} values >= 2^32, because + // assuming non-empty chunks they would generate too-long strings anyway. + const double raw_len_number = raw_len->Number(); + const uint32_t length = raw_len_number > std::numeric_limits<uint32_t>::max() + ? std::numeric_limits<uint32_t>::max() + : static_cast<uint32_t>(raw_len_number); if (length > 0) { Handle<Object> first_element; ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, first_element, diff --git a/deps/v8/src/builtins/builtins-typed-array.cc b/deps/v8/src/builtins/builtins-typed-array.cc index 8c913c301d..ac1b23c8d3 100644 --- a/deps/v8/src/builtins/builtins-typed-array.cc +++ b/deps/v8/src/builtins/builtins-typed-array.cc @@ -27,21 +27,18 @@ BUILTIN(TypedArrayPrototypeBuffer) { namespace { int64_t CapRelativeIndex(Handle<Object> num, int64_t minimum, int64_t maximum) { - int64_t relative; if (V8_LIKELY(num->IsSmi())) { - relative = Smi::ToInt(*num); + int64_t relative = Smi::ToInt(*num); + return relative < 0 ? std::max<int64_t>(relative + maximum, minimum) + : std::min<int64_t>(relative, maximum); } else { DCHECK(num->IsHeapNumber()); - double fp = HeapNumber::cast(*num)->value(); - if (V8_UNLIKELY(!std::isfinite(fp))) { - // +Infinity / -Infinity - DCHECK(!std::isnan(fp)); - return fp < 0 ? minimum : maximum; - } - relative = static_cast<int64_t>(fp); + double relative = HeapNumber::cast(*num)->value(); + DCHECK(!std::isnan(relative)); + return static_cast<int64_t>( + relative < 0 ? std::max<double>(relative + maximum, minimum) + : std::min<double>(relative, maximum)); } - return relative < 0 ? std::max<int64_t>(relative + maximum, minimum) - : std::min<int64_t>(relative, maximum); } } // namespace |