grub/grub-core/osdep/unix
Patrick Steinhardt 2da5f067f4 unix exec: avoid atexit handlers when child exits
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>
2020-09-21 12:02:37 -04:00
..
compress.c Rewrite grub-install, grub-mkrescue, grub-mkstandalone and grub-mknetdir 2013-11-16 20:21:16 +01:00
config.c * grub-core/osdep/unix/config.c: Remove extraneous comma. 2014-09-21 17:49:13 +02:00
cputime.c unix/cputime.c: Cache sc_clk_tck and check it for sanity. 2015-01-21 17:42:15 +01:00
dl.c Move OS-dependent mprotect for module loading to grub-core/osdep/*/dl.c 2013-12-08 18:08:23 +01:00
emuconsole.c * grub-core/osdep/unix/emuconsole.c (put): Pacify the compiler on 2013-11-13 13:34:57 +00:00
exec.c unix exec: avoid atexit handlers when child exits 2020-09-21 12:02:37 -04:00
getroot.c build: Use AC_HEADER_MAJOR to find device macros 2016-04-24 08:12:42 +03:00
hostdisk.c Support lseek64. 2020-09-21 11:32:45 -04:00
password.c unix: do not close stdin in grub_passwd_get 2015-11-18 22:23:58 +03:00
platform.c Clarify several translatable messages. 2013-12-21 01:41:16 +01:00
random.c Add a wrapper for fopen. On unix-like systems just pass-through. On 2013-10-13 20:36:28 +02:00
relpath.c unix/relpath: memory leak 2015-06-19 18:38:25 +03:00
sleep.c Move sleep routines to grub-core/osdep. 2013-10-08 17:38:46 +02:00