From 5b42f8c154906584455a4989038406c88b723cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 26 Jan 2023 09:42:46 +0100 Subject: 'spawn' ensures it is passed open file ports. Fixes . * libguile/posix.c (FDES_FROM_PORT_OR_INTEGER): When OBJ is not an integer, use 'SCM_VALIDATE_OPFPORT' before using 'SCM_FPORT_FDES'. * test-suite/tests/posix.test ("spawn")["non-file port argument"]: New test. --- libguile/posix.c | 18 +++++++++++++----- test-suite/tests/posix.test | 5 +++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/libguile/posix.c b/libguile/posix.c index 0b1fe2637..3a8be94e4 100644 --- a/libguile/posix.c +++ b/libguile/posix.c @@ -1486,12 +1486,20 @@ SCM_DEFINE (scm_spawn_process, "spawn", 2, 0, 1, if (SCM_UNBNDP (err_scm)) err_scm = scm_current_error_port (); -#define FDES_FROM_PORT_OR_INTEGER(obj) \ - (scm_is_integer (obj) ? scm_to_int (obj) : SCM_FPORT_FDES (obj)) +#define FDES_FROM_PORT_OR_INTEGER(fd, obj, pos) \ + { \ + if (scm_is_integer (obj)) \ + fd = scm_to_int (obj); \ + else \ + { \ + SCM_VALIDATE_OPFPORT (pos, obj); \ + fd = SCM_FPORT_FDES (obj); \ + } \ + } - in = FDES_FROM_PORT_OR_INTEGER (in_scm); - out = FDES_FROM_PORT_OR_INTEGER (out_scm); - err = FDES_FROM_PORT_OR_INTEGER (err_scm); + FDES_FROM_PORT_OR_INTEGER (in, in_scm, 3); + FDES_FROM_PORT_OR_INTEGER (out, out_scm, 4); + FDES_FROM_PORT_OR_INTEGER (err, err_scm, 5); #undef FDES_FROM_PORT_OR_INTEGER diff --git a/test-suite/tests/posix.test b/test-suite/tests/posix.test index bd3e6218c..f20e04453 100644 --- a/test-suite/tests/posix.test +++ b/test-suite/tests/posix.test @@ -386,6 +386,11 @@ 0 (cdr (waitpid (spawn "true" '("true"))))) + (pass-if-exception "non-file port argument" ; + exception:wrong-type-arg + (spawn "true" '("true") + #:error (%make-void-port "w"))) + (pass-if-equal "uname with stdout redirect" (list 0 ;exit value (string-append (utsname:sysname (uname)) " " -- cgit v1.2.1