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