Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGuillaume Tuton <guillaume@tuton.fr>2010-11-07 17:34:20 +0300
committerRyan Dahl <ry@tinyclouds.org>2010-11-08 00:07:14 +0300
commit07da49b095553bf440dab05072755343afbdc461 (patch)
tree1700e11865dde24c1544602707df0aaefab8a717 /test
parenta3750a983351f3646592d2cb831b947fb6bfbf5a (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.js71
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');
+});