HomeFreeBSD

fusefs: multiple interruptility improvements

Description

fusefs: multiple interruptility improvements

  1. Don't explicitly not mask SIGKILL. kern_sigprocmask won't allow it to be masked, anyway.
  1. Fix an infinite loop bug. If a process received both a maskable signal lower than 9 (like SIGINT) and then received SIGKILL, fticket_wait_answer would spin. msleep would immediately return EINTR, but cursig would return SIGINT, so the sleep would get retried. Fix it by explicitly checking whether SIGKILL has been received.
  1. Abandon the sig_isfatal optimization introduced by r346357. That optimization would cause fticket_wait_answer to return immediately, without waiting for a response from the server, if the process were going to exit anyway. However, it's vulnerable to a race:
    1. fatal signal is received while fticket_wait_answer is sleeping.
    2. fticket_wait_answer sends the FUSE_INTERRUPT operation.
    3. fticket_wait_answer determines that the signal was fatal and returns without waiting for a response.
    4. Another thread changes the signal to non-fatal.
    5. The first thread returns to userspace. Instead of exiting, the process continues.
    6. The application receives EINTR, wrongly believes that the operation was successfully interrupted, and restarts it. This could cause problems for non-idempotent operations like FUSE_RENAME.

Reported by: kib (the race part)
Sponsored by: The FreeBSD Foundation

Details

Provenance
asomersAuthored on Jul 17 2019, 10:45 PM
Parents
rG822f5b1dadf2: style changes to getvfsbyname
Branches
Unknown
Tags
Unknown

Event Timeline