diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-12-11 15:23:05 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-01-11 12:26:58 -0300 |
commit | 42dda89dcb0407f6799dbfd0b9dab1529666ad51 (patch) | |
tree | 895e367e9d4cd02a94205bf63e6387c6f05af7f1 | |
parent | 7b9c3260bcca73781dda6bc2ddee84869bedfb8c (diff) | |
download | glibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.tar.gz glibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.tar.xz glibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.zip |
posix: Fix return value of system if shell can not be executed [BZ #27053]
POSIX states that system returned code for failure to execute the shell shall be as if the shell had terminated using _exit(127). This behaviour was removed with 5fb7fc96350575. Checked on x86_64-linux-gnu.
-rw-r--r-- | stdlib/tst-system.c | 17 | ||||
-rw-r--r-- | support/Makefile | 1 | ||||
-rw-r--r-- | sysdeps/posix/system.c | 4 |
3 files changed, 22 insertions, 0 deletions
diff --git a/stdlib/tst-system.c b/stdlib/tst-system.c index 95a2615d95..178808e048 100644 --- a/stdlib/tst-system.c +++ b/stdlib/tst-system.c @@ -26,6 +26,7 @@ #include <support/check.h> #include <support/temp_file.h> #include <support/support.h> +#include <support/xunistd.h> static char *tmpdir; static long int namemax; @@ -138,6 +139,22 @@ do_test (void) support_capture_subprocess_check (&result, "system", 0, sc_allow_none); } + { + struct stat64 st; + xstat (_PATH_BSHELL, &st); + mode_t mode = st.st_mode; + xchmod (_PATH_BSHELL, mode & ~(S_IXUSR | S_IXGRP | S_IXOTH)); + + struct support_capture_subprocess result; + result = support_capture_subprocess (call_system, + &(struct args) { + "exit 1", 127, 0 + }); + support_capture_subprocess_check (&result, "system", 0, sc_allow_none); + + xchmod (_PATH_BSHELL, st.st_mode); + } + TEST_COMPARE (system (""), 0); return 0; diff --git a/support/Makefile b/support/Makefile index 62d6c6ddaa..bb9889efb4 100644 --- a/support/Makefile +++ b/support/Makefile @@ -91,6 +91,7 @@ libsupport-routines = \ xchroot \ xclock_gettime \ xclose \ + xchmod \ xconnect \ xcopy_file_range \ xdlfcn \ diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c index e53ec5f977..13c0662f90 100644 --- a/sysdeps/posix/system.c +++ b/sysdeps/posix/system.c @@ -175,6 +175,10 @@ do_system (const char *line) __libc_cleanup_region_end (0); #endif } + else + /* POSIX states that failure to execute the shell should return + as if the shell had terminated using _exit(127). */ + status = W_EXITCODE (127, 0); DO_LOCK (); if (SUB_REF () == 0) |