Don't Insert() a VFD entry until it's fully built.
authorTom Lane
Tue, 17 Nov 2020 01:32:35 +0000 (20:32 -0500)
committerTom Lane
Tue, 17 Nov 2020 01:32:35 +0000 (20:32 -0500)
Otherwise, if FDDEBUG is enabled, the debugging output fails because
it tries to read the fileName, which isn't set up yet (and should in
fact always be NULL).

AFAICT, this has been wrong since Berkeley.  Before 96bf88d52,
it would accidentally fail to crash on platforms where snprintf()
is forgiving about being passed a NULL pointer for %s; but the
file name intended to be included in the debug output wouldn't
ever have shown up.

Report and fix by Greg Nancarrow.  Although this is only visibly
broken in custom-made builds, it still seems worth back-patching
to all supported branches, as the FDDEBUG code is pretty useless
as it stands.

Discussion: https://postgr.es/m/CAJcOf-cUDgm9qYtC_B6XrC6MktMPNRby2p61EtSGZKnfotMArw@mail.gmail.com

src/backend/storage/file/fd.c

index 5f6420efb2d76e76fbfee6c00b6080981e9e80f4..e5950b0726f5360072f33d31a6b709ee2fa5c32a 100644 (file)
@@ -1485,8 +1485,6 @@ PathNameOpenFilePerm(const char *fileName, int fileFlags, mode_t fileMode)
    DO_DB(elog(LOG, "PathNameOpenFile: success %d",
               vfdP->fd));
 
-   Insert(file);
-
    vfdP->fileName = fnamecopy;
    /* Saved flags are adjusted to be OK for re-opening file */
    vfdP->fileFlags = fileFlags & ~(O_CREAT | O_TRUNC | O_EXCL);
@@ -1495,6 +1493,8 @@ PathNameOpenFilePerm(const char *fileName, int fileFlags, mode_t fileMode)
    vfdP->fdstate = 0x0;
    vfdP->resowner = NULL;
 
+   Insert(file);
+
    return file;
 }