Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions database/DBio.c
Original file line number Diff line number Diff line change
Expand Up @@ -3875,7 +3875,6 @@ DBCellWrite(cellDef, fileName)
const char *cp1;
char *cp2, *dotptr;
char expandbuf[NAME_SIZE];
FILE *realf, *tmpf;
int tmpres;
struct stat statb;
bool result, exists;
Expand Down Expand Up @@ -3989,6 +3988,7 @@ DBCellWrite(cellDef, fileName)
tmpname = StrDup((char **)NULL, expandname);
}

FILE *realf = NULL, *tmpf;
/*
* See if we can create a temporary file in this directory.
* If so, write to the temp file and then rename it after
Expand Down Expand Up @@ -4119,6 +4119,7 @@ DBCellWrite(cellDef, fileName)
#endif
realf = fopen(expandname, "r");

bool do_close = FALSE;
if (realf == NULL)
{
cellDef->cd_flags |= CDMODIFIED;
Expand All @@ -4135,22 +4136,35 @@ DBCellWrite(cellDef, fileName)
}

#ifdef FILE_LOCKS
/* when file locking is in use the FD needs to stay open to hold the lock
* as with fcntl() locking any call to close() on any FD even dup() and
* those from separate open() calls, will cause all locks to be dropped
* by all FDs as they are process wide locks and associated with file
* system st_dev(kernel-device)/st_ino(inode) and not with FD handles.
*/
cellDef->cd_fd = -1;
if (FileLocking && (is_locked == FALSE))
cellDef->cd_fd = fd;
else if (FileLocking && (is_locked == TRUE))
cellDef->cd_fd = -2;
else
do_close = TRUE;
#else
do_close = TRUE;
#endif
fclose(realf);
}
if(do_close)
fclose(realf);
/* invalidate even if we don't close to ensure cleanup below does not close */
realf = NULL;
}

cleanup:
SigEnableInterrupts();
freeMagic(realname);
freeMagic(tmpname);
if(realf)
fclose(realf);
return result;
}

Expand Down
Loading