aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-09-27 14:13:02 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2017-09-27 14:13:02 +0300
commit0145de1db25c3840346b9cd9ea44e571812e5516 (patch)
tree92c29f344764a54ce07d99d487321896bec53162
parent80134405a63517bda8964f7993d096dc1df247c1 (diff)
downloadruncap-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.c45
-rw-r--r--t/pipe.at2
-rw-r--r--t/stdin.at2
3 files changed, 19 insertions, 30 deletions
diff --git a/runcap.c b/runcap.c
index f1e9410..26654f8 100644
--- a/runcap.c
+++ b/runcap.c
@@ -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)
diff --git a/t/pipe.at b/t/pipe.at
index 3b31f3f..974afa7 100644
--- a/t/pipe.at
+++ b/t/pipe.at
@@ -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
],
diff --git a/t/stdin.at b/t/stdin.at
index 36f684c..4556145 100644
--- a/t/stdin.at
+++ b/t/stdin.at
@@ -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
],

Return to:

Send suggestions and report system problems to the System administrator.