aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-16 20:32:35 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-16 20:32:35 -0500
commit95d39547d83999aff728806e36fd740ee97bd86a (patch)
tree849045849418c06a7bd4037be989be7166868c0f /src
parentfea5960fafb0002ea2a80bed1dc03e3a4f85fa1d (diff)
downloadpostgresql-95d39547d83999aff728806e36fd740ee97bd86a.tar.gz
postgresql-95d39547d83999aff728806e36fd740ee97bd86a.zip
Don't Insert() a VFD entry until it's fully built.
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/file/fd.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 5f6420efb2d..e5950b0726f 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -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;
}