mirror of
https://github.com/nodejs/node.git
synced 2025-05-06 11:29:26 +00:00

v8::Object::GetAlignedPointerFromInternalField() returns a random value if Wrap() hasn't been run on the object handle. Causing v8 to abort if certain getters are accessed. It's possible to access these getters and functions during class construction through the AsyncWrap init() callback, and also possible in a subset of those scenarios while running the persistent handle visitor. Mitigate this issue by manually setting the internal aligned pointer field to nullptr in the BaseObject constructor and add necessary logic to return appropriate values when nullptr is encountered. PR-URL: https://github.com/nodejs/node/pull/6184 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Anna Henningsen <anna@addaleax.net>
59 lines
1.6 KiB
JavaScript
59 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
const async_wrap = process.binding('async_wrap');
|
|
const uv = process.binding('uv');
|
|
const assert = require('assert');
|
|
const common = require('../common');
|
|
const dgram = require('dgram');
|
|
const fs = require('fs');
|
|
const net = require('net');
|
|
const tls = require('tls');
|
|
const providers = Object.keys(async_wrap.Providers);
|
|
var flags = 0;
|
|
|
|
// Make sure all asserts have run at least once.
|
|
process.on('exit', () => assert.equal(flags, 0b111));
|
|
|
|
function init(id, provider) {
|
|
this._external; // Test will abort if nullptr isn't properly checked.
|
|
switch (providers[provider]) {
|
|
case 'TCPWRAP':
|
|
assert.equal(this.fd, uv.UV_EINVAL);
|
|
flags |= 0b1;
|
|
break;
|
|
case 'TLSWRAP':
|
|
assert.equal(this.fd, uv.UV_EINVAL);
|
|
flags |= 0b10;
|
|
break;
|
|
case 'UDPWRAP':
|
|
assert.equal(this.fd, uv.UV_EBADF);
|
|
flags |= 0b100;
|
|
break;
|
|
}
|
|
}
|
|
|
|
async_wrap.setupHooks({ init });
|
|
async_wrap.enable();
|
|
|
|
const checkTLS = common.mustCall(function checkTLS() {
|
|
const options = {
|
|
key: fs.readFileSync(common.fixturesDir + '/keys/ec-key.pem'),
|
|
cert: fs.readFileSync(common.fixturesDir + '/keys/ec-cert.pem')
|
|
};
|
|
const server = tls.createServer(options, () => {})
|
|
.listen(common.PORT, function() {
|
|
tls.connect(common.PORT, { rejectUnauthorized: false }, function() {
|
|
this.destroy();
|
|
server.close();
|
|
});
|
|
});
|
|
});
|
|
|
|
const checkTCP = common.mustCall(function checkTCP() {
|
|
net.createServer(() => {}).listen(common.PORT, function() {
|
|
this.close(checkTLS);
|
|
});
|
|
});
|
|
|
|
dgram.createSocket('udp4').close(checkTCP);
|