src: add aliased-buffer-overflow abort test

Added native extension similar to
test/addons/stringbytes-external-exceeded-max.
Added an abort test to regression test the non overflow behaviour.

PR-URL: https://github.com/nodejs/node/pull/31740
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
pull/32563/head
Christian Niederer 2020-02-12 21:07:10 +01:00 committed by Anna Henningsen
parent 8245a7816c
commit babeb58c52
No known key found for this signature in database
GPG Key ID: A94130F0BFC8EBE9
4 changed files with 68 additions and 0 deletions

View File

@ -0,0 +1,8 @@
{
'defines': [ 'V8_DEPRECATION_WARNINGS=1', 'NODE_WANT_INTERNALS=1' ],
'conditions': [
[ 'OS in "linux freebsd openbsd solaris android aix cloudabi"', {
'cflags': ['-Wno-cast-function-type'],
}],
],
}

View File

@ -0,0 +1,23 @@
#include <stdlib.h>
#include <node.h>
#include <v8.h>
#include <aliased_buffer.h>
#include <util-inl.h>
void AllocateAndResizeBuffer(
const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
int64_t length = args[0].As<v8::BigInt>()->Int64Value();
node::AliasedBigUint64Array array{isolate, 0};
array.reserve(length);
assert(false);
}
void init(v8::Local<v8::Object> exports) {
NODE_SET_METHOD(exports,
"allocateAndResizeBuffer",
AllocateAndResizeBuffer);
}

View File

@ -0,0 +1,9 @@
{
'targets': [
{
'target_name': 'binding',
'sources': [ 'binding.cc' ],
'includes': ['../common.gypi'],
}
]
}

View File

@ -0,0 +1,28 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const cp = require('child_process');
// This test ensures that during resizing of an Aliased*Array the computation
// of the new size does not overflow.
if (process.argv[2] === 'child') {
// test
const binding = require(`./build/${common.buildType}/binding`);
const bigValue = BigInt('0xE000 0000 E000 0000');
binding.AllocateAndResizeBuffer(bigValue);
assert.fail('this should be unreachable');
} else {
// observer
const child = cp.spawn(`${process.execPath}`, [`${__filename}`, 'child']);
child.on('exit', common.mustCall(function(code, signal) {
if (common.isWindows) {
assert.strictEqual(code, 134);
assert.strictEqual(signal, null);
} else {
assert.strictEqual(code, null);
assert.strictEqual(signal, 'SIGABRT');
}
}));
}