Skip to content
  • Patrick Steinhardt's avatar
    unix exec: avoid atexit handlers when child exits · e75cf4a5
    Patrick Steinhardt authored
    
    
    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: default avatarPatrick Steinhardt <ps@pks.im>
    e75cf4a5