aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-12-11 15:23:05 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-01-11 12:26:58 -0300
commit42dda89dcb0407f6799dbfd0b9dab1529666ad51 (patch)
tree895e367e9d4cd02a94205bf63e6387c6f05af7f1
parent7b9c3260bcca73781dda6bc2ddee84869bedfb8c (diff)
downloadglibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.zip
glibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.tar.gz
glibc-42dda89dcb0407f6799dbfd0b9dab1529666ad51.tar.bz2
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.c17
-rw-r--r--support/Makefile1
-rw-r--r--sysdeps/posix/system.c4
3 files changed, 22 insertions, 0 deletions
diff --git a/stdlib/tst-system.c b/stdlib/tst-system.c
index 95a2615..178808e 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 62d6c6d..bb9889e 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 e53ec5f..13c0662 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)