execve is not atomic, what is the exit state of the process when execve fails after throwing away the original process image?
From: Steven Stewart-Gallus <hidden>
Date: 2014-05-02 02:19:52
Hello, can any kernel gurus please help me out with what happens on this weird corner-case? Quoting Rich Felker at http://ewontfix.com/14/:
For common reasons it might fail, the execve syscall returns failure
in the original process image, allowing the program to handle the
error. However, failure of execve is not entirely atomic:
The kernel may fail setting up the VM for the new process image
after the original VM has already been destroyed; the main
situation under which this would happen is resource exhaustion.
Even after the kernel successfully sets up the new VM and
transfers execution to the new process image, it's possible to
have failures prior to the transfer of control to the actual
application program. This could happen in the dynamic linker
(resource exhaustion or other transient failures mapping required
libraries or loading configuration files) or libc startup
code. Using musl libc with static linking or even dynamic linking
with no additional libraries eliminates these failure cases, but
systemd is intended to be used with glibc.execve is not atomic, what is the exit state of the process when execve fails after throwing away the original process image? I already have a hacky solution (see https://gitorious.org/linted/linted/source/d25eac7a6fb58946ec8112771c0c56eb39fd1055:src/spawn/spawn.c) to finding when a process fails before or at execve and now I want to know what exit status is returned so I can give a nice error message.