diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-09-27 14:13:02 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-09-27 14:13:02 +0300 |
commit | 0145de1db25c3840346b9cd9ea44e571812e5516 (patch) | |
tree | 92c29f344764a54ce07d99d487321896bec53162 | |
parent | 80134405a63517bda8964f7993d096dc1df247c1 (diff) | |
download | runcap-0145de1db25c3840346b9cd9ea44e571812e5516.tar.gz runcap-0145de1db25c3840346b9cd9ea44e571812e5516.tar.bz2 |
Avoid closing stdin.
When given the RCF_STDIN flag, runcap_init failed to initialize
rc_cap[RUNCAP_STDIN].sc_storfd. It remained initialized to 0 which
eventually led to stdin being inadvertenlty closed by runcap_free.
* runcap.c (stream_capture_alloc): Merge with stream_capture_init.
All callers updated.
(runcap_init): Initialize rc_cap[RUNCAP_STDIN].sc_storfd to -1
to prevent it from being closed.
* t/pipe.at: Set 5 seconds timeout.
* t/stdin.at: Likewise.
-rw-r--r-- | runcap.c | 45 | ||||
-rw-r--r-- | t/pipe.at | 2 | ||||
-rw-r--r-- | t/stdin.at | 2 |
3 files changed, 19 insertions, 30 deletions
@@ -28,5 +28,10 @@ -static int -stream_capture_alloc(struct stream_capture *cap, size_t size) +int +stream_capture_init(struct stream_capture *cap, size_t size) { + if (!cap) { + errno = EINVAL; + return -1; + } + if (size) { @@ -47,16 +52,2 @@ stream_capture_alloc(struct stream_capture *cap, size_t size) -int -stream_capture_init(struct stream_capture *cap, size_t size) -{ - if (!cap) { - errno = EINVAL; - return -1; - } - - if (stream_capture_alloc(cap, size)) - return -1; - - return 0; -} - static void @@ -436,2 +427,3 @@ runcap_init(struct runcap *rc, int flags) rc->rc_timeout = 0; + if (flags & RCF_STDIN) { @@ -445,2 +437,3 @@ runcap_init(struct runcap *rc, int flags) rc->rc_cap[RUNCAP_STDIN].sc_cur = 0; + rc->rc_cap[RUNCAP_STDIN].sc_storfd = -1; } else if (stream_capture_init(&rc->rc_cap[RUNCAP_STDIN], 0)) @@ -448,8 +441,6 @@ runcap_init(struct runcap *rc, int flags) - if (flags & RCF_STDOUT_SIZE) - res = stream_capture_alloc(&rc->rc_cap[RUNCAP_STDOUT], - rc->rc_cap[RUNCAP_STDOUT].sc_size); - else - res = stream_capture_init(&rc->rc_cap[RUNCAP_STDOUT], - STRCAP_BUFSIZE); + res = stream_capture_init(&rc->rc_cap[RUNCAP_STDOUT], + (flags & RCF_STDOUT_SIZE) + ? rc->rc_cap[RUNCAP_STDOUT].sc_size + : STRCAP_BUFSIZE); if (res) @@ -462,8 +453,6 @@ runcap_init(struct runcap *rc, int flags) - if (flags & RCF_STDERR_SIZE) - res = stream_capture_alloc(&rc->rc_cap[RUNCAP_STDERR], - rc->rc_cap[RUNCAP_STDERR].sc_size); - else - res = stream_capture_init(&rc->rc_cap[RUNCAP_STDERR], - STRCAP_BUFSIZE); + res = stream_capture_init(&rc->rc_cap[RUNCAP_STDERR], + (flags & RCF_STDERR_SIZE) + ? rc->rc_cap[RUNCAP_STDERR].sc_size + : STRCAP_BUFSIZE); if (res) @@ -18,3 +18,3 @@ AT_SETUP([pipe stdin]) AT_KEYWORDS([pipe]) -AT_CHECK([rt -n all -i -f $INPUT -- genout -l 337 -o - -s 628 -l 734 -e $INPUT +AT_CHECK([rt -n all -t 5 -i -f $INPUT -- genout -l 337 -o - -s 628 -l 734 -e $INPUT ], @@ -18,3 +18,3 @@ AT_SETUP([supply stdin]) AT_KEYWORDS([stdin]) -AT_CHECK([rt -n all -f $INPUT -- genout -l 337 -o - -s 628 -l 734 -e $INPUT +AT_CHECK([rt -n all -t 5 -f $INPUT -- genout -l 337 -o - -s 628 -l 734 -e $INPUT ], |