Skip to content

Commit

Permalink
src: add aliased-buffer-overflow abort test
Browse files Browse the repository at this point in the history
Added native extension similar to
test/addons/stringbytes-external-exceeded-max.
Added an abort test to regression test the non overflow behaviour.

PR-URL: nodejs#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>
  • Loading branch information
amdoku authored and addaleax committed Mar 30, 2020
1 parent 8245a78 commit babeb58
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
8 changes: 8 additions & 0 deletions test/abort/common.gypi
@@ -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'],
}],
],
}
23 changes: 23 additions & 0 deletions test/abort/test_abort-aliased-buffer-overflow/binding.cc
@@ -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);
}
9 changes: 9 additions & 0 deletions test/abort/test_abort-aliased-buffer-overflow/binding.gyp
@@ -0,0 +1,9 @@
{
'targets': [
{
'target_name': 'binding',
'sources': [ 'binding.cc' ],
'includes': ['../common.gypi'],
}
]
}
@@ -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');
}
}));
}

0 comments on commit babeb58

Please sign in to comment.