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 5fb7fc9635.

Checked on x86_64-linux-gnu.
This commit is contained in:
Adhemerval Zanella 2020-12-11 15:23:05 -03:00
parent 7b9c3260bc
commit 42dda89dcb
3 changed files with 22 additions and 0 deletions

View File

@ -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;

View File

@ -91,6 +91,7 @@ libsupport-routines = \
xchroot \
xclock_gettime \
xclose \
xchmod \
xconnect \
xcopy_file_range \
xdlfcn \

View File

@ -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)