GeezerVison is showing github.com — child_process: fix parsing messages with splitted length field · nodejs/node@8bbdb12
File tree
Expand file treeCollapse file tree
Open diff view settings
lib/internal/child_process
Expand file treeCollapse file tree
Open diff view settings
Collapse file
Copy file name to clipboardExpand all lines: lib/internal/child_process/serialization.js +6-1Lines changed: 6 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -61,7 +61,12 @@ const advanced = { |
61 | 61 | *parseChannelMessages(channel, readData) { |
62 | 62 | if (readData.length === 0) return; |
63 | 63 |
|
64 | | - ArrayPrototypePush(channel[kMessageBuffer], readData); |
| 64 | + if (channel[kMessageBufferSize] && channel[kMessageBuffer][0].length < 4) { |
| 65 | + // Message length split into two buffers, so let's concatenate it. |
| 66 | + channel[kMessageBuffer][0] = Buffer.concat([channel[kMessageBuffer][0], readData]); |
| 67 | + } else { |
| 68 | + ArrayPrototypePush(channel[kMessageBuffer], readData); |
| 69 | + } |
65 | 70 | channel[kMessageBufferSize] += readData.length; |
66 | 71 |
|
67 | 72 | // Index 0 should always be present because we just pushed data into it. |
|
Collapse file
Copy file name to clipboard +24Lines changed: 24 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
|
| 1 | +'use strict'; |
| 2 | +const common = require('../common'); |
| 3 | +const child_process = require('child_process'); |
| 4 | + |
| 5 | +// Regression test for https://github.com/nodejs/node/issues/55834 |
| 6 | +const msgLen = 65521; |
| 7 | +let cnt = 10; |
| 8 | + |
| 9 | +if (process.argv[2] === 'child') { |
| 10 | + const msg = Buffer.allocUnsafe(msgLen); |
| 11 | + (function send() { |
| 12 | + if (cnt--) { |
| 13 | + process.send(msg, send); |
| 14 | + } else { |
| 15 | + process.disconnect(); |
| 16 | + } |
| 17 | + })(); |
| 18 | +} else { |
| 19 | + const child = child_process.spawn(process.execPath, [__filename, 'child'], { |
| 20 | + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], |
| 21 | + serialization: 'advanced' |
| 22 | + }); |
| 23 | + child.on('message', common.mustCall(cnt)); |
| 24 | +} |