• Thomas Munro's avatar
    Fix inconsistent out-of-memory error reporting in dsa.c. · 29ddb548
    Thomas Munro authored
    Commit 16be2fd1 introduced the flag DSA_ALLOC_NO_OOM to control whether
    the DSA allocator would raise an error or return InvalidDsaPointer on
    failure to allocate.  One edge case was not handled correctly: if we
    fail to allocate an internal "span" object for a large allocation, we
    would always return InvalidDsaPointer regardless of the flag; a caller
    not expecting that could then dereference a null pointer.
    
    This is a plausible explanation for a one-off report of a segfault.
    
    Remove a redundant pair of braces so that all three stanzas that handle
    DSA_ALLOC_NO_OOM match in style, for visual consistency.
    
    While fixing inconsistencies, if FreePageManagerGet() can't supply the
    pages that our book-keeping says it should be able to supply, then we
    should always report a FATAL error.  Previously we treated that as a
    regular allocation failure in one code path, but as a FATAL condition
    in another.
    
    Back-patch to 10, where dsa.c landed.
    
    Author: Thomas Munro
    Reported-by: Jakub Glapa
    Discussion: https://postgr.es/m/CAEepm=2oPqXxyWQ-1o60tpOLrwkw=VpgNXqqF1VN2EyO9zKGQw@mail.gmail.com
    29ddb548
dsa.c 75.7 KB