HomeFreeBSD

kern: restore signal mask before ast() for pselect/ppoll

Description

kern: restore signal mask before ast() for pselect/ppoll

It's possible to take a signal after pselect/ppoll have set their return
value, but before we actually return to userland. This results in
taking a signal without reflecting it in the return value, which weakens
the guarantees provided by these functions.

Switch both to restore the signal mask before we would deliver signals
on return to userland. If a signal was received after the wait was
over, then we'll just have the signal queued up for the next time it
comes unblocked. The modified signal mask is retained if we were
interrupted so that ast() actually handles the signal, at which point
the signal mask is restored.

des@ has a test case demonstrating the issue in D47738 which will
follow.

Reported by: des
Reviewed by: des (earlier version), kib
Sponsored by: Klara, Inc.
Sponsored by: NetApp, Inc.

(cherry picked from commit ccb973da1f1b65879eade8e65cdd2885e125f90e)

Details

Provenance
kevansAuthored on Nov 26 2024, 4:04 AM
Parents
rGfff3323694f7: amdiommu: correctly initialize iommu.unit
Branches
Unknown
Tags
Unknown