e75cf4a58b
The `grub_util_exec_redirect_all` helper function can be used to spawn an executable and redirect its output to some files. After calling `fork()`, the parent will wait for the child to terminate with `waitpid()` while the child prepares its file descriptors, environment and finally calls `execvp()`. If something in the children's setup fails, it will stop by calling `exit(127)`. Calling `exit()` will cause any function registered via `atexit()` to be executed, which is usually the wrong thing to do in a child. And actually, one can easily observe faulty behaviour on musl-based systems without modprobe(8) installed: executing `grub-install --help` will call `grub_util_exec_redirect_all` with "modprobe", which obviously fails if modprobe(8) is not installed. Due to the child now exiting and invoking the `atexit()` handlers, it will clean up some data structures of the parent and cause it to be deadlocked in the `waitpid()` syscall. The issue can easily be fixed by calling `_exit(127)` instead, which is especially designed to be called when the atexit-handlers should not be executed. Signed-off-by: Patrick Steinhardt <ps@pks.im> |
||
---|---|---|
.. | ||
apple | ||
aros | ||
basic | ||
bsd | ||
devmapper | ||
freebsd | ||
generic | ||
haiku | ||
hurd | ||
linux | ||
sun | ||
unix | ||
windows | ||
blocklist.c | ||
compress.c | ||
config.c | ||
cputime.c | ||
dl.c | ||
emuconsole.c | ||
emunet.c | ||
exec.c | ||
getroot.c | ||
hostdisk.c | ||
init.c | ||
ofpath.c | ||
password.c | ||
platform.c | ||
platform_unix.c | ||
random.c | ||
relpath.c | ||
sleep.c |