diff --git a/CHANGELOG.md b/CHANGELOG.md index a0064c09fe77b3..ab99af5f92621a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ release lines. Select a Node.js version below to view the changelog history: -* [Node.js 10](doc/changelogs/CHANGELOG_V10.md) — **Current** +* [Node.js 10](doc/changelogs/CHANGELOG_V10.md) — **Long Term Support** * [Node.js 9](doc/changelogs/CHANGELOG_V9.md) — End-of-Life -* [Node.js 8](doc/changelogs/CHANGELOG_V8.md) — **Long Term Support** +* [Node.js 8](doc/changelogs/CHANGELOG_V8.md) — Long Term Support * [Node.js 7](doc/changelogs/CHANGELOG_V7.md) — End-of-Life * [Node.js 6](doc/changelogs/CHANGELOG_V6.md) — Long Term Support * [Node.js 5](doc/changelogs/CHANGELOG_V5.md) — End-of-Life @@ -31,7 +31,8 @@ release. -10.12.0
+10.13.0
+10.12.0
10.11.0
10.10.0
10.9.0
diff --git a/Makefile b/Makefile index 05d3056f27973e..a98772faea6dca 100644 --- a/Makefile +++ b/Makefile @@ -480,8 +480,11 @@ build-ci: # of tests. See `test-ci-native` and `test-ci-js`. # - node-test-commit-linux-coverage: where the build and the tests need # to be instrumented, see `coverage`. +# +# Using -j1 as the sub target in `test-ci` already have internal parallelism. +# Refs: https://github.com/nodejs/node/pull/23733 run-ci: build-ci - $(MAKE) test-ci + $(MAKE) test-ci -j1 test-release: test-build $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) diff --git a/common.gypi b/common.gypi index c235f07712c74f..14c6b5ae9f8463 100644 --- a/common.gypi +++ b/common.gypi @@ -33,7 +33,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.35', + 'v8_embedder_string': '-node.36', # Enable disassembler for `--print-code` v8 options 'v8_enable_disassembler': 1, diff --git a/deps/v8/gypfiles/features.gypi b/deps/v8/gypfiles/features.gypi index 35a078e8af2fd2..618949124a71cb 100644 --- a/deps/v8/gypfiles/features.gypi +++ b/deps/v8/gypfiles/features.gypi @@ -103,7 +103,9 @@ # Enable mitigations for executing untrusted code. 'v8_untrusted_code_mitigations%': 'true', - 'v8_enable_handle_zapping%': 1, + # Currently set for node by common.gypi, avoiding default because of gyp file bug. + # Should be turned on only for debugging. + #'v8_enable_handle_zapping%': 0, }, 'target_defaults': { 'conditions': [ @@ -164,9 +166,10 @@ ['v8_untrusted_code_mitigations=="false"', { 'defines': ['DISABLE_UNTRUSTED_CODE_MITIGATIONS',], }], - ['v8_enable_handle_zapping==1', { - 'defines': ['ENABLE_HANDLE_ZAPPING',], - }], + # Refs: https://github.com/nodejs/node/pull/23801 + # ['v8_enable_handle_zapping==1', { + # 'defines': ['ENABLE_HANDLE_ZAPPING',], + # }], ], # conditions 'defines': [ 'V8_GYP_BUILD', diff --git a/deps/v8/gypfiles/toolchain.gypi b/deps/v8/gypfiles/toolchain.gypi index 7f497fac91e2b2..ea8f1c2f00da56 100644 --- a/deps/v8/gypfiles/toolchain.gypi +++ b/deps/v8/gypfiles/toolchain.gypi @@ -1321,6 +1321,10 @@ }, { 'inherit_from': ['DebugBase1'], }], + # Temporary refs: https://github.com/nodejs/node/pull/23801 + ['v8_enable_handle_zapping==1', { + 'defines': ['ENABLE_HANDLE_ZAPPING',], + }], ], }, # Debug 'ReleaseBase': { @@ -1405,6 +1409,8 @@ }, # Release 'Release': { 'inherit_from': ['ReleaseBase'], + # Temporary refs: https://github.com/nodejs/node/pull/23801 + 'defines!': ['ENABLE_HANDLE_ZAPPING',], }, # Debug 'conditions': [ [ 'OS=="win"', { diff --git a/doc/changelogs/CHANGELOG_V10.md b/doc/changelogs/CHANGELOG_V10.md index 5b69c7c4e52a64..244247586955b2 100644 --- a/doc/changelogs/CHANGELOG_V10.md +++ b/doc/changelogs/CHANGELOG_V10.md @@ -9,6 +9,7 @@ +10.13.0
10.12.0
10.11.0
10.10.0
@@ -40,6 +41,25 @@ * [io.js](CHANGELOG_IOJS.md) * [Archive](CHANGELOG_ARCHIVE.md) + +## 2018-10-30, Version 10.13.0 'Dubnium' (LTS), @MylesBorins + +This release marks the transition of Node.js 10.x into Long Term +Support (LTS) with the codename 'Dubnium'. The 10.x release line +now moves in to "Active LTS" and will remain so until April 2020. +After that time it will move in to "Maintenance" until end of +life in April 2021. + +### Notable Changes + +This release only includes minimal changes necessary to fix known regressions prior to LTS. + +### Commits + +* [[`2ba6010082`](https://github.com/nodejs/node/commit/2ba6010082)] - **buffer**: fix crash for invalid index types (Anna Henningsen) +* [[`2cd68be69d`](https://github.com/nodejs/node/commit/2cd68be69d)] - **build**: spawn `make test-ci` with `-j1` (Refael Ackermann) [#23733](https://github.com/nodejs/node/pull/23733) +* [[`1003f4c975`](https://github.com/nodejs/node/commit/1003f4c975)] - **deps**: fix wrong default for v8 handle zapping (Refael Ackermann) [#23801](https://github.com/nodejs/node/pull/23801) + ## 2018-10-10, Version 10.12.0 (Current), @targos diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 8642477db4d927..bf79e66cb19b5d 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -40,16 +40,18 @@ #define THROW_AND_RETURN_IF_OOB(r) \ do { \ - if (!(r)) return node::THROW_ERR_INDEX_OUT_OF_RANGE(env); \ - } while (0) + if ((r).IsNothing()) return; \ + if (!(r).FromJust()) \ + return node::THROW_ERR_INDEX_OUT_OF_RANGE(env); \ + } while (0) \ -#define SLICE_START_END(start_arg, end_arg, end_max) \ +#define SLICE_START_END(env, start_arg, end_arg, end_max) \ size_t start; \ size_t end; \ - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(start_arg, 0, &start)); \ - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(end_arg, end_max, &end)); \ + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, start_arg, 0, &start)); \ + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, end_arg, end_max, &end)); \ if (end < start) end = start; \ - THROW_AND_RETURN_IF_OOB(end <= end_max); \ + THROW_AND_RETURN_IF_OOB(Just(end <= end_max)); \ size_t length = end - start; namespace node { @@ -76,9 +78,11 @@ using v8::EscapableHandleScope; using v8::FunctionCallbackInfo; using v8::Integer; using v8::Isolate; +using v8::Just; using v8::Local; using v8::Maybe; using v8::MaybeLocal; +using v8::Nothing; using v8::Object; using v8::String; using v8::Uint32; @@ -161,29 +165,32 @@ void CallbackInfo::WeakCallback(Isolate* isolate) { } -// Parse index for external array data. -inline MUST_USE_RESULT bool ParseArrayIndex(Local arg, - size_t def, - size_t* ret) { +// Parse index for external array data. An empty Maybe indicates +// a pending exception. `false` indicates that the index is out-of-bounds. +inline MUST_USE_RESULT Maybe ParseArrayIndex(Environment* env, + Local arg, + size_t def, + size_t* ret) { if (arg->IsUndefined()) { *ret = def; - return true; + return Just(true); } - CHECK(arg->IsNumber()); - int64_t tmp_i = arg.As()->Value(); + int64_t tmp_i; + if (!arg->IntegerValue(env->context()).To(&tmp_i)) + return Nothing(); if (tmp_i < 0) - return false; + return Just(false); // Check that the result fits in a size_t. const uint64_t kSizeMax = static_cast(static_cast(-1)); // coverity[pointless_expression] if (static_cast(tmp_i) > kSizeMax) - return false; + return Just(false); *ret = static_cast(tmp_i); - return true; + return Just(true); } } // anonymous namespace @@ -452,7 +459,7 @@ void StringSlice(const FunctionCallbackInfo& args) { if (ts_obj_length == 0) return args.GetReturnValue().SetEmptyString(); - SLICE_START_END(args[0], args[1], ts_obj_length) + SLICE_START_END(env, args[0], args[1], ts_obj_length) Local error; MaybeLocal ret = @@ -485,9 +492,10 @@ void Copy(const FunctionCallbackInfo &args) { size_t source_start; size_t source_end; - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[2], 0, &target_start)); - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[3], 0, &source_start)); - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[4], ts_obj_length, &source_end)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[2], 0, &target_start)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[3], 0, &source_start)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[4], ts_obj_length, + &source_end)); // Copy 0 bytes; we're done if (target_start >= target_length || source_start >= source_end) @@ -617,13 +625,13 @@ void StringWrite(const FunctionCallbackInfo& args) { size_t offset; size_t max_length; - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[1], 0, &offset)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[1], 0, &offset)); if (offset > ts_obj_length) { return node::THROW_ERR_BUFFER_OUT_OF_BOUNDS( env, "\"offset\" is outside of buffer bounds"); } - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[2], ts_obj_length - offset, + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[2], ts_obj_length - offset, &max_length)); max_length = MIN(ts_obj_length - offset, max_length); @@ -678,10 +686,12 @@ void CompareOffset(const FunctionCallbackInfo &args) { size_t source_end; size_t target_end; - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[2], 0, &target_start)); - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[3], 0, &source_start)); - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[4], target_length, &target_end)); - THROW_AND_RETURN_IF_OOB(ParseArrayIndex(args[5], ts_obj_length, &source_end)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[2], 0, &target_start)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[3], 0, &source_start)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[4], target_length, + &target_end)); + THROW_AND_RETURN_IF_OOB(ParseArrayIndex(env, args[5], ts_obj_length, + &source_end)); if (source_start > ts_obj_length) return node::THROW_ERR_INDEX_OUT_OF_RANGE(env); diff --git a/src/node_version.h b/src/node_version.h index 5b8f941fcb3879..7e7b31f8bc7859 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -23,13 +23,13 @@ #define SRC_NODE_VERSION_H_ #define NODE_MAJOR_VERSION 10 -#define NODE_MINOR_VERSION 12 -#define NODE_PATCH_VERSION 1 +#define NODE_MINOR_VERSION 13 +#define NODE_PATCH_VERSION 0 -#define NODE_VERSION_IS_LTS 0 -#define NODE_VERSION_LTS_CODENAME "" +#define NODE_VERSION_IS_LTS 1 +#define NODE_VERSION_LTS_CODENAME "Dubnium" -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n) diff --git a/test/parallel/test-buffer-copy.js b/test/parallel/test-buffer-copy.js index 8ede5101463b05..f3c351f09aead3 100644 --- a/test/parallel/test-buffer-copy.js +++ b/test/parallel/test-buffer-copy.js @@ -18,6 +18,17 @@ let cntr = 0; } } +{ + // Current behavior is to coerce values to integers. + b.fill(++cntr); + c.fill(++cntr); + const copied = b.copy(c, '0', '0', '512'); + assert.strictEqual(copied, 512); + for (let i = 0; i < c.length; i++) { + assert.strictEqual(c[i], b[i]); + } +} + { // copy c into b, without specifying sourceEnd b.fill(++cntr); @@ -144,3 +155,18 @@ assert.strictEqual(b.copy(c, 512, 0, 10), 0); assert.strictEqual(c[i], e[i]); } } + +// https://github.com/nodejs/node/issues/23668: Do not crash for invalid input. +c.fill('c'); +b.copy(c, 'not a valid offset'); +// Make sure this acted like a regular copy with `0` offset. +assert.deepStrictEqual(c, b.slice(0, c.length)); + +{ + c.fill('C'); + assert.throws(() => { + b.copy(c, { [Symbol.toPrimitive]() { throw new Error('foo'); } }); + }, /foo/); + // No copying took place: + assert.deepStrictEqual(c.toString(), 'C'.repeat(c.length)); +} diff --git a/test/parallel/test-process-release.js b/test/parallel/test-process-release.js index 8b6bca9141beed..019903d09322a4 100644 --- a/test/parallel/test-process-release.js +++ b/test/parallel/test-process-release.js @@ -15,6 +15,8 @@ if (versionParts[0] === '4' && versionParts[1] >= 2) { assert.strictEqual(process.release.lts, 'Boron'); } else if (versionParts[0] === '8' && versionParts[1] >= 9) { assert.strictEqual(process.release.lts, 'Carbon'); +} else if (versionParts[0] === '10' && versionParts[1] >= 13) { + assert.strictEqual(process.release.lts, 'Dubnium'); } else { assert.strictEqual(process.release.lts, undefined); }