mirror of https://github.com/lukechilds/node.git
Browse Source
Set the `req.buffer` property, which serves as a way of keeping a `Buffer` alive that is being written to a stream, on the C++ side instead of the JS side. This closes a hole where buffers that were temporarily created in order to write strings with uncommon encodings (e.g. `hex`) were passed to the native side without being set as `req.buffer`. Fixes: https://github.com/nodejs/node/issues/8251 PR-URL: https://github.com/nodejs/node/pull/8252 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Trevor Norris <trev.norris@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>v6.x
Anna Henningsen
8 years ago
committed by
Jeremiah Senkpiel
5 changed files with 68 additions and 1 deletions
@ -0,0 +1,34 @@ |
|||
'use strict'; |
|||
// Flags: --expose-gc
|
|||
|
|||
// Note: This is a variant of test-net-write-fully-async-hex-string.js.
|
|||
// This always worked, but it seemed appropriate to add a test that checks the
|
|||
// behaviour for Buffers, too.
|
|||
const common = require('../common'); |
|||
const net = require('net'); |
|||
|
|||
const data = Buffer.alloc(1000000); |
|||
|
|||
const server = net.createServer(common.mustCall(function(conn) { |
|||
conn.resume(); |
|||
})).listen(0, common.mustCall(function() { |
|||
const conn = net.createConnection(this.address().port, common.mustCall(() => { |
|||
let count = 0; |
|||
|
|||
function writeLoop() { |
|||
if (count++ === 200) { |
|||
conn.destroy(); |
|||
server.close(); |
|||
return; |
|||
} |
|||
|
|||
while (conn.write(Buffer.from(data))); |
|||
global.gc(true); |
|||
// The buffer allocated above should still be alive.
|
|||
} |
|||
|
|||
conn.on('drain', writeLoop); |
|||
|
|||
writeLoop(); |
|||
})); |
|||
})); |
@ -0,0 +1,32 @@ |
|||
'use strict'; |
|||
// Flags: --expose-gc
|
|||
|
|||
// Regression test for https://github.com/nodejs/node/issues/8251.
|
|||
const common = require('../common'); |
|||
const net = require('net'); |
|||
|
|||
const data = Buffer.alloc(1000000).toString('hex'); |
|||
|
|||
const server = net.createServer(common.mustCall(function(conn) { |
|||
conn.resume(); |
|||
})).listen(0, common.mustCall(function() { |
|||
const conn = net.createConnection(this.address().port, common.mustCall(() => { |
|||
let count = 0; |
|||
|
|||
function writeLoop() { |
|||
if (count++ === 20) { |
|||
conn.destroy(); |
|||
server.close(); |
|||
return; |
|||
} |
|||
|
|||
while (conn.write(data, 'hex')); |
|||
global.gc(true); |
|||
// The buffer allocated inside the .write() call should still be alive.
|
|||
} |
|||
|
|||
conn.on('drain', writeLoop); |
|||
|
|||
writeLoop(); |
|||
})); |
|||
})); |
Loading…
Reference in new issue