[PATCH] posix: Fix return value of system if shell can not be executed [BZ #27053]
Adhemerval Zanella
adhemerval.zanella@linaro.org
Mon Jan 11 13:44:49 GMT 2021
On 11/01/2021 07:01, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:
>
>> 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.
>>
>> This issue should not be possible for pclose because if the shell can
>> not be executed, popen would not return a valid FILE object. Other
>> process execution failures (such as killed by a signal) would be
>> returned through waitpid from pclose call.
>
> Note that execve is not atomic and a late resource allocation failure
> will be reported as a termination by a signal (because the previous
> process image is gone at that point).
But afaiu the failure in shell execution by the posix_spawn will be
readily reported since execve would fail. I think any late resource
failure allocation would be reported as pipe close (_IO_fileno (fp)).
Are you saying that spawn_process in libio/iopopen.c maybe return
true even if "sh" can not be executed?
>
>> The new tst-system has an underlying issue once new containers tests
>> are added that might issue the minimal container shell, since it
>> changes the shell execution mode. It is not an issue now, since it is
>> the only container tests for stdlib subforder, and I would like to
>
> Typo: “subforder”
>
>> avoid setting non parallel execution. Another possibility if
>> concurrent container tests issues the minimum shell would be to
>> add a advisory lock.
>
> I think you should replace “issue[s]” with different words in a few
> places. Right now, the wording is quite confusing.
>
> If the test is destructive to the testroot, I think there is already a
> way to mark it as such.
I simplified the commit message to just:
POSIX states that system returned code for failure to execute the shell
shall be as if the shell had terminated using _exit(127). This
behavior was removed with 5fb7fc96350575.
>
>> ---
>> stdlib/tst-system.c | 17 +++++++++++++++++
>> support/Makefile | 1 +
>> support/xchmod.c | 30 ++++++++++++++++++++++++++++++
>> support/xunistd.h | 1 +
>> sysdeps/posix/system.c | 4 ++++
>> 5 files changed, 53 insertions(+)
>> create mode 100644 support/xchmod.c
>
> support/ changes should be committed separately.
>
>> diff --git a/support/xunistd.h b/support/xunistd.h
>> index b299db77ba..29b9a028b0 100644
>> --- a/support/xunistd.h
>> +++ b/support/xunistd.h
>> @@ -45,6 +45,7 @@ long xsysconf (int name);
>> long long xlseek (int fd, long long offset, int whence);
>> void xftruncate (int fd, long long length);
>> void xsymlink (const char *target, const char *linkpath);
>> +void xchmod (const char *pathname, mode_t mode);
>>
>> /* Equivalent of "mkdir -p". */
>> void xmkdirp (const char *, mode_t);
>> diff --git a/sysdeps/posix/system.c b/sysdeps/posix/system.c
>> index a03f478fc7..b86fc9b756 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)
>
> This still sets errno, but I think this is okay.
>
> Thanks,
> Florian
>
More information about the Libc-alpha
mailing list