-
Notifications
You must be signed in to change notification settings - Fork 7.3k
Why does nodejs hand down a socket instead of a character device when exec is being called? #5689
Comments
A UNIX socket lets you send and receive file descriptors, something you can't do with pipes or FIFOs. v0.6 actually used pipes to address issues like the one you described above but that got people up in arms because it took away the aforementioned functionality. That's why v0.8 switched back to UNIX sockets. I guess we could add an option that says 'use a pipe rather than a socket pair' but that would be strictly a workaround for broken programs. It's arguably better to fix the issue upstream, like you did with xctool. |
Please, at least document this behavior. I just spent a significant amount of time figuring out why I can't properly run pysandbox via exec – it checks if stdin is either S_ISCHR, S_ISREG or S_ISFIFO. You might call programs that don't check for S_ISSOCK broken, but this is the second time I'm encountering this issue. Last time it was a bash script that reads from |
The following significant (semver-major) changes have been made since the previous Node v5.0.0 release. * Buffer * New Buffer constructors have been added [nodejs#4682](nodejs/node#4682) * Previously deprecated Buffer APIs are removed [nodejs#5048](nodejs/node#5048), [nodejs#4594](nodejs/node#4594) * Improved error handling [nodejs#4514](nodejs/node#4514) * Cluster * Worker emitted as first argument in 'message' event [nodejs#5361](nodejs/node#5361). * Crypto * Improved error handling [nodejs#3100](nodejs/node#3100), [nodejs#5611](nodejs/node#5611) * Simplified Certificate class bindings [nodejs#5382](nodejs/node#5382) * Improved control over FIPS mode [nodejs#5181](nodejs/node#5181) * pbkdf2 digest overloading is deprecated [nodejs#4047](nodejs/node#4047) * Dependencies * Reintroduce shared c-ares build support [nodejs#5775](nodejs/node#5775). * V8 updated to 5.0.71.31 [nodejs#6111](nodejs/node#6111). * DNS * Add resolvePtr API to query plain DNS PTR records [nodejs#4921](nodejs/node#4921). * Domains * Clear stack when no error handler [nodejs#4659](nodejs/node#4659). * File System * The `fs.realpath()` and `fs.realpathSync()` methods have been updated to use a more efficient libuv implementation. This change includes the removal of the `cache` argument and the method can throw new errors [nodejs#3594](nodejs/node#3594) * FS apis can now accept and return paths as Buffers [nodejs#5616](nodejs/node#5616). * Error handling and type checking improvements [nodejs#5616](nodejs/node#5616), [nodejs#5590](nodejs/node#5590), [nodejs#4518](nodejs/node#4518), [nodejs#3917](nodejs/node#3917). * fs.read's string interface is deprecated [nodejs#4525](nodejs/node#4525) * HTTP * 'clientError' can now be used to return custom errors from an HTTP server [nodejs#4557](nodejs/node#4557). * Modules * Current directory is now prioritized for local lookups [nodejs#5689](nodejs/node#5689) * Symbolic links are preserved when requiring modules [nodejs#5950](nodejs/node#5950) * Net * DNS hints no longer implicitly set [nodejs#6021](nodejs/node#6021). * Improved error handling and type checking [nodejs#5981](nodejs/node#5981), [nodejs#5733](nodejs/node#5733), [nodejs#2904](nodejs/node#2904) * Path * Improved type checking [nodejs#5348](nodejs/node#5348). * Process * Introduce process warnings API [nodejs#4782](nodejs/node#4782). * Throw exception when non-function passed to nextTick [nodejs#3860](nodejs/node#3860). * Readline * Emit key info unconditionally [nodejs#6024](nodejs/node#6024) * REPL * Assignment to `_` will emit a warning. [nodejs#5535](nodejs/node#5535) * Timers * Fail early when callback is not a function [nodejs#4362](nodejs/node#4362) * TLS * Rename 'clientError' to 'tlsClientError' [nodejs#4557](nodejs/node#4557) * SHA1 used for sessionIdContext [nodejs#3866](nodejs/node#3866) * TTY * Previously deprecated setRawMode wrapper is removed [nodejs#2528](nodejs/node#2528). * Util * Changes to Error object formatting [nodejs#4582](nodejs/node#4582). * Windows * Windows XP and Vista are no longer supported [nodejs#5167](nodejs/node#5167), [nodejs#5167](nodejs/node#5167).
The following significant (semver-major) changes have been made since the previous Node v5.0.0 release. * Buffer * New Buffer constructors have been added [nodejs#4682](nodejs/node#4682) * Previously deprecated Buffer APIs are removed [nodejs#5048](nodejs/node#5048), [nodejs#4594](nodejs/node#4594) * Improved error handling [nodejs#4514](nodejs/node#4514) * Cluster * Worker emitted as first argument in 'message' event [nodejs#5361](nodejs/node#5361). * Crypto * Improved error handling [nodejs#3100](nodejs/node#3100), [nodejs#5611](nodejs/node#5611) * Simplified Certificate class bindings [nodejs#5382](nodejs/node#5382) * Improved control over FIPS mode [nodejs#5181](nodejs/node#5181) * pbkdf2 digest overloading is deprecated [nodejs#4047](nodejs/node#4047) * Dependencies * Reintroduce shared c-ares build support [nodejs#5775](nodejs/node#5775). * V8 updated to 5.0.71.31 [nodejs#6111](nodejs/node#6111). * DNS * Add resolvePtr API to query plain DNS PTR records [nodejs#4921](nodejs/node#4921). * Domains * Clear stack when no error handler [nodejs#4659](nodejs/node#4659). * File System * The `fs.realpath()` and `fs.realpathSync()` methods have been updated to use a more efficient libuv implementation. This change includes the removal of the `cache` argument and the method can throw new errors [nodejs#3594](nodejs/node#3594) * FS apis can now accept and return paths as Buffers [nodejs#5616](nodejs/node#5616). * Error handling and type checking improvements [nodejs#5616](nodejs/node#5616), [nodejs#5590](nodejs/node#5590), [nodejs#4518](nodejs/node#4518), [nodejs#3917](nodejs/node#3917). * fs.read's string interface is deprecated [nodejs#4525](nodejs/node#4525) * HTTP * 'clientError' can now be used to return custom errors from an HTTP server [nodejs#4557](nodejs/node#4557). * Modules * Current directory is now prioritized for local lookups [nodejs#5689](nodejs/node#5689) * Symbolic links are preserved when requiring modules [nodejs#5950](nodejs/node#5950) * Net * DNS hints no longer implicitly set [nodejs#6021](nodejs/node#6021). * Improved error handling and type checking [nodejs#5981](nodejs/node#5981), [nodejs#5733](nodejs/node#5733), [nodejs#2904](nodejs/node#2904) * OS X * MACOSX_DEPLOYMENT_TARGET has been bumped up to 10.7 [nodejs#6402](nodejs/node#6402). * Path * Improved type checking [nodejs#5348](nodejs/node#5348). * Process * Introduce process warnings API [nodejs#4782](nodejs/node#4782). * Throw exception when non-function passed to nextTick [nodejs#3860](nodejs/node#3860). * Readline * Emit key info unconditionally [nodejs#6024](nodejs/node#6024) * REPL * Assignment to `_` will emit a warning. [nodejs#5535](nodejs/node#5535) * Timers * Fail early when callback is not a function [nodejs#4362](nodejs/node#4362) * TLS * Rename 'clientError' to 'tlsClientError' [nodejs#4557](nodejs/node#4557) * SHA1 used for sessionIdContext [nodejs#3866](nodejs/node#3866) * TTY * Previously deprecated setRawMode wrapper is removed [nodejs#2528](nodejs/node#2528). * Util * Changes to Error object formatting [nodejs#4582](nodejs/node#4582). * Windows * Windows XP and Vista are no longer supported [nodejs#5167](nodejs/node#5167), [nodejs#5167](nodejs/node#5167).
The following significant (semver-major) changes have been made since the previous Node v5.0.0 release. * Buffer * New Buffer constructors have been added [nodejs#4682](nodejs/node#4682) * Previously deprecated Buffer APIs are removed [nodejs#5048](nodejs/node#5048), [nodejs#4594](nodejs/node#4594) * Improved error handling [nodejs#4514](nodejs/node#4514) * Cluster * Worker emitted as first argument in 'message' event [nodejs#5361](nodejs/node#5361). * Crypto * Improved error handling [nodejs#3100](nodejs/node#3100), [nodejs#5611](nodejs/node#5611) * Simplified Certificate class bindings [nodejs#5382](nodejs/node#5382) * Improved control over FIPS mode [nodejs#5181](nodejs/node#5181) * pbkdf2 digest overloading is deprecated [nodejs#4047](nodejs/node#4047) * Dependencies * Reintroduce shared c-ares build support [nodejs#5775](nodejs/node#5775). * V8 updated to 5.0.71.31 [nodejs#6111](nodejs/node#6111). * DNS * Add resolvePtr API to query plain DNS PTR records [nodejs#4921](nodejs/node#4921). * Domains * Clear stack when no error handler [nodejs#4659](nodejs/node#4659). * File System * The `fs.realpath()` and `fs.realpathSync()` methods have been updated to use a more efficient libuv implementation. This change includes the removal of the `cache` argument and the method can throw new errors [nodejs#3594](nodejs/node#3594) * FS apis can now accept and return paths as Buffers [nodejs#5616](nodejs/node#5616). * Error handling and type checking improvements [nodejs#5616](nodejs/node#5616), [nodejs#5590](nodejs/node#5590), [nodejs#4518](nodejs/node#4518), [nodejs#3917](nodejs/node#3917). * fs.read's string interface is deprecated [nodejs#4525](nodejs/node#4525) * HTTP * 'clientError' can now be used to return custom errors from an HTTP server [nodejs#4557](nodejs/node#4557). * Modules * Current directory is now prioritized for local lookups [nodejs#5689](nodejs/node#5689) * Symbolic links are preserved when requiring modules [nodejs#5950](nodejs/node#5950) * Net * DNS hints no longer implicitly set [nodejs#6021](nodejs/node#6021). * Improved error handling and type checking [nodejs#5981](nodejs/node#5981), [nodejs#5733](nodejs/node#5733), [nodejs#2904](nodejs/node#2904) * OS X * MACOSX_DEPLOYMENT_TARGET has been bumped up to 10.7 [nodejs#6402](nodejs/node#6402). * Path * Improved type checking [nodejs#5348](nodejs/node#5348). * Process * Introduce process warnings API [nodejs#4782](nodejs/node#4782). * Throw exception when non-function passed to nextTick [nodejs#3860](nodejs/node#3860). * Readline * Emit key info unconditionally [nodejs#6024](nodejs/node#6024) * REPL * Assignment to `_` will emit a warning. [nodejs#5535](nodejs/node#5535) * Timers * Fail early when callback is not a function [nodejs#4362](nodejs/node#4362) * TLS * Rename 'clientError' to 'tlsClientError' [nodejs#4557](nodejs/node#4557) * SHA1 used for sessionIdContext [nodejs#3866](nodejs/node#3866) * TTY * Previously deprecated setRawMode wrapper is removed [nodejs#2528](nodejs/node#2528). * Util * Changes to Error object formatting [nodejs#4582](nodejs/node#4582). * Windows * Windows XP and Vista are no longer supported [nodejs#5167](nodejs/node#5167), [nodejs#5167](nodejs/node#5167).
When using a simple snippet to execute a command with nodejs, such as
The stdin and stdout that are given to the process are not character devices, but sockets. For example ruby, perl and other languages hand down a character device. Full experiment:
https://github.com/FabianFrank/node-exec-socket
It seems that generally this is not problematic. However, today I stumbled upon the following piece of code in Facebook's xctool, where
fdstat
is the result of callingfstat(fileno(stdout), &fdstat);
.https://github.com/facebook/xctool/blob/master/xctool/xctool/Reporter.m#L212
What happens when you run the resulting program through nodejs' exec is that since stdout is not a FIFO, synchronizeFile is called, which results in the following error, as sockets don't support sychronizeFile.
Clearly, this is something that xctool could (and probably should) handle better, but it makes you wonder if it wouldn't be better if nodejs could hand down a character device. Is there a specific reason, for why handing down a socket is better?
The text was updated successfully, but these errors were encountered: