• Tom Lane's avatar
    Fix multiple bugs in tablespace symlink removal. · 93c301fc
    Tom Lane authored
    Don't try to examine S_ISLNK(st.st_mode) after a failed lstat().
    It's undefined.
    
    Also, if the lstat() reported ENOENT, we do not wish that to be a hard
    error, but the code might nonetheless treat it as one (giving an entirely
    misleading error message, too) depending on luck-of-the-draw as to what
    S_ISLNK() returned.
    
    Don't throw error for ENOENT from rmdir(), either.  (We're not really
    expecting ENOENT because we just stat'd the file successfully; but
    if we're going to allow ENOENT in the symlink code path, surely the
    directory code path should too.)
    
    Generate an appropriate errcode for its-the-wrong-type-of-file complaints.
    (ERRCODE_SYSTEM_ERROR doesn't seem appropriate, and failing to write
    errcode() around it certainly doesn't work, and not writing an errcode
    at all is not per project policy.)
    
    Valgrind noticed the undefined S_ISLNK result; the other problems emerged
    while reading the code in the area.
    
    All of this appears to have been introduced in 8f15f74a.
    Back-patch to 9.5 where that commit appeared.
    93c301fc
tablespace.c 42.8 KB