• Alvaro Herrera's avatar
    Fix locking in WAL receiver/sender shmem state structs · 572d6ee6
    Alvaro Herrera authored
    In WAL receiver and WAL server, some accesses to their corresponding
    shared memory control structs were done without holding any kind of
    lock, which could lead to inconsistent and possibly insecure results.
    
    In walsender, fix by clarifying the locking rules and following them
    correctly, as documented in the new comment in walsender_private.h;
    namely that some members can be read in walsender itself without a lock,
    because the only writes occur in the same process.  The rest of the
    struct requires spinlock for accesses, as usual.
    
    In walreceiver, fix by always holding spinlock while accessing the
    struct.
    
    While there is potentially a problem in all branches, it is minor in
    stable ones.  This only became a real problem in pg10 because of quorum
    commit in synchronous replication (commit 3901fd70), and a potential
    security problem in walreceiver because a superuser() check was removed
    by default monitoring roles (commit 25fff407).  Thus, no backpatch.
    
    In passing, clean up some leftover braces which were used to create
    unconditional blocks.  Once upon a time these were used for
    volatile-izing accesses to those shmem structs, which is no longer
    required.  Many other occurrences of this pattern remain.
    
    Author: Michaël Paquier
    Reported-by: Michaël Paquier
    Reviewed-by: Masahiko Sawada, Kyotaro Horiguchi, Thomas Munro,
    	Robert Haas
    Discussion: https://postgr.es/m/CAB7nPqTWYqtzD=LN_oDaf9r-hAjUEPAy0B9yRkhcsLdRN8fzrw@mail.gmail.com
    572d6ee6
walsender.c 98 KB