grub/grub-core
Patrick Steinhardt e75cf4a58b 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>
2017-08-30 15:20:13 +02:00
..
2017-05-18 21:58:15 +02:00
2017-07-09 21:31:19 +02:00
2015-01-27 17:17:58 +01:00
2016-01-12 21:52:50 +03:00
2017-08-14 16:24:05 +02:00
2017-05-03 13:03:50 +02:00
2017-05-03 12:49:31 +02:00
2017-08-14 16:27:10 +02:00
2017-05-03 12:49:31 +02:00
2013-04-27 02:00:16 +02:00
2013-04-11 21:12:46 +02:00
2013-04-11 21:12:46 +02:00
2013-04-11 21:12:46 +02:00
2013-04-11 21:12:46 +02:00
2017-05-08 22:06:04 +02:00
2017-08-14 16:23:52 +02:00
2017-05-03 12:49:31 +02:00