OpenAFS Master Repository branch, openafs-stable-1_8_x, updated. openafs-stable-1_8_10-30-g08a9085

Gerrit Code Review gerrit@openafs.org
Thu, 5 Oct 2023 08:41:56 -0400


The following commit has been merged in the openafs-stable-1_8_x branch:
commit 08a90850fd792718ec5abdda172ab0214abfced6
Author: Andrew Deason <adeason@sinenomine.net>
Date:   Tue Feb 7 22:48:23 2023 -0600

    vol: Re-evaluate conditons for cond vars
    
    Most users of cond vars follow this general pattern when waiting for a
    condition:
    
        while (!condition) {
    	CV_WAIT(cv, mutex);
        }
    
    But a few places in src/vol do this:
    
        if (!condition) {
    	CV_WAIT(cv, mutex);
        }
    
    It is important to always re-check for the relevant condition after
    waiting for a CV, even if it seems like we only need to wait exactly
    once, because pthread_cond_wait() is allowed to wake up its caller
    spuriously even the CV hasn't been signalled. On Solaris, this can
    actually happen if the calling thread is interrupted by a signal.
    
    In VInitPreAttachVolumes() for DAFS, currently this can cause a
    segfault if CV_WAIT returns while 'vq' is empty. We will try to
    queue_Remove() the head of the queue itself, resulting in vq.head.next
    being set to NULL, which will segfault when we try to pull the next
    item off of the queue.
    
    We generally cannot be interrupted by a signal when using opr's
    softsig, because signals are only delivered to the softsig thread and
    blocked in all other threads. It is technically possible to trigger
    this situation on Solaris by sending the (unblockable) SIGCANCEL
    signal, though this would be very unusual.
    
    To make sure issues like this cannot happen and to avoid weird corner
    cases, adjust all of our CV waiters to wait for a CV using a while()
    loop or similar pattern. Spurious wakeups may be impossible with LWP,
    but just try to make all code use a similar structure to be safe.
    
    Thanks for mvitale@sinenomine.net for finding and investigating the
    relevant issue.
    
    Reviewed-on: https://gerrit.openafs.org/15327
    Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
    Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
    Reviewed-by: Marcio Brito Barbosa <mbarbosa@sinenomine.net>
    Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
    Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
    Tested-by: BuildBot <buildbot@rampaginggeek.com>
    (cherry picked from commit 9bc06a059121207b354fdf97f65029d8c2b3df30)
    
    Change-Id: Ib1fdf06570e441b4a322a1e9b90ff084e07ad1fb
    Reviewed-on: https://gerrit.openafs.org/15543
    Reviewed-by: Andrew Deason <adeason@sinenomine.net>
    Tested-by: BuildBot <buildbot@rampaginggeek.com>
    Reviewed-by: Marcio Brito Barbosa <mbarbosa@sinenomine.net>
    Reviewed-by: Kailas Zadbuke <kailashsz@in.ibm.com>
    Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>

 src/vol/volume.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

-- 
OpenAFS Master Repository