diff options
author | Guillaume Tuton <guillaume@tuton.fr> | 2010-11-07 17:34:20 +0300 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2010-11-08 00:07:14 +0300 |
commit | 07da49b095553bf440dab05072755343afbdc461 (patch) | |
tree | 1700e11865dde24c1544602707df0aaefab8a717 /test | |
parent | a3750a983351f3646592d2cb831b947fb6bfbf5a (diff) |
Set FD_CLOEXEC flag on stdio FDs before spawning.
With regression test.
Diffstat (limited to 'test')
-rw-r--r-- | test/simple/test-child-process-double-pipe.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/test/simple/test-child-process-double-pipe.js b/test/simple/test-child-process-double-pipe.js new file mode 100644 index 00000000000..f98cb65ff14 --- /dev/null +++ b/test/simple/test-child-process-double-pipe.js @@ -0,0 +1,71 @@ +var assert = require('assert'), + util = require('util'), + spawn = require('child_process').spawn; + +// We're trying to reproduce: +// $ echo -e "hello\nnode\nand\nworld" | grep o | sed s/o/a/ + +var + echo = spawn('echo', ['-e', 'hello\nnode\nand\nworld\n']), + grep = spawn('grep', ['o']), + sed = spawn('sed', ['s/o/O/']); + +/* + * grep and sed hang if the spawn function leaks file descriptors to child + * processes. + * This happens when calling pipe(2) and then forgetting to set the + * FD_CLOEXEC flag on the resulting file descriptors. + * + * This test checks child processes exit, meaning they don't hang like + * explained above. + */ + + + +// pipe echo | grep +echo.stdout.on('data', function (data) { + if (!grep.stdin.write(data)) { + echo.stdout.pause(); + } +}); + +grep.stdin.on('drain', function (data) { + echo.stdout.resume(); +}); + +// propagate end from echo to grep +echo.stdout.on('end', function (code) { + grep.stdin.end(); +}); + + + +// pipe grep | sed +grep.stdout.on('data', function (data) { + if (!sed.stdin.write(data)) { + grep.stdout.pause(); + } +}); + +sed.stdin.on('drain', function (data) { + grep.stdout.resume(); +}); + +// propagate end from grep to sed +grep.stdout.on('end', function (code) { + sed.stdin.end(); +}); + + + +var result = ''; + +// print sed's output +sed.stdout.on('data', function (data) { + result += data.toString('utf8', 0, data.length); + util.print(data); +}); + +sed.stdout.on('end', function (code) { + assert.equal(result, 'hellO\nnOde\nwOrld\n'); +}); |