From 15d60a12f2c5846f39ce2df22127e19078b84e9b Mon Sep 17 00:00:00 2001 From: Albert Chu Date: Fri, 4 Oct 2024 14:22:46 -0700 Subject: [PATCH] libsubprocess: check that bufsize > 0 Problem: A channel bufsize setting of 0 is technically possible, which should not be allowed. Check for bufsize > 0. Add unit test. --- src/common/libsubprocess/test/channel.c | 27 +++++++++++++++++++------ src/common/libsubprocess/util.c | 4 ++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/common/libsubprocess/test/channel.c b/src/common/libsubprocess/test/channel.c index 2210610ccb13..ba5d2488278f 100644 --- a/src/common/libsubprocess/test/channel.c +++ b/src/common/libsubprocess/test/channel.c @@ -430,6 +430,12 @@ void test_bufsize_error (flux_reactor_t *r) char *av[] = { "/bin/true", NULL }; flux_cmd_t *cmd; flux_subprocess_t *p = NULL; + flux_subprocess_ops_t ops = { + .on_completion = completion_cb, + .on_channel_out = subprocess_standard_output, + .on_stdout = subprocess_standard_output, + .on_stderr = subprocess_standard_output + }; ok ((cmd = flux_cmd_create (1, av, NULL)) != NULL, "flux_cmd_create"); @@ -439,18 +445,27 @@ void test_bufsize_error (flux_reactor_t *r) ok (flux_cmd_setopt (cmd, "TEST_CHANNEL_BUFSIZE", "ABCD") == 0, "flux_cmd_setopt set TEST_CHANNEL_BUFSIZE success"); - flux_subprocess_ops_t ops = { - .on_completion = completion_cb, - .on_channel_out = subprocess_standard_output, - .on_stdout = subprocess_standard_output, - .on_stderr = subprocess_standard_output - }; p = flux_local_exec (r, 0, cmd, &ops); ok (p == NULL && errno == EINVAL, "flux_local_exec fails with EINVAL due to bad bufsize input"); flux_cmd_destroy (cmd); + + ok ((cmd = flux_cmd_create (1, av, NULL)) != NULL, "flux_cmd_create"); + + ok (flux_cmd_add_channel (cmd, "TEST_CHANNEL") == 0, + "flux_cmd_add_channel success adding channel TEST_CHANNEL"); + + ok (flux_cmd_setopt (cmd, "TEST_CHANNEL_BUFSIZE", "0") == 0, + "flux_cmd_setopt set TEST_CHANNEL_BUFSIZE success"); + + p = flux_local_exec (r, 0, cmd, &ops); + ok (p == NULL + && errno == EINVAL, + "flux_local_exec fails with EINVAL due to bufsize zero"); + + flux_cmd_destroy (cmd); } int main (int argc, char *argv[]) diff --git a/src/common/libsubprocess/util.c b/src/common/libsubprocess/util.c index b53465d6873e..1fca89586169 100644 --- a/src/common/libsubprocess/util.c +++ b/src/common/libsubprocess/util.c @@ -55,6 +55,10 @@ int cmd_option_bufsize (flux_subprocess_t *p, const char *name) uint64_t size; if (parse_size (val, &size) < 0) goto cleanup; + if (size == 0) { + errno = EINVAL; + goto cleanup; + } if (size > INT_MAX) { errno = EOVERFLOW; goto cleanup;