DBio.c: CodeQL File{MayNot,Never}BeClosed.ql file-handle resource leaks
Guided by CodeQL static code analyser. FileMayNotBeClosed.ql FileMayNeverBeClosed.ql Technically the FILE_LOCKS feature leaks the file handle, but maybe this isn't in a perfectly controlled way (with assurance that at some correct point in the program future, all the fd's are eventually closed)
This commit is contained in:
parent
c4a2a54cb7
commit
402080049b
|
|
@ -3875,7 +3875,6 @@ DBCellWrite(cellDef, fileName)
|
||||||
const char *cp1;
|
const char *cp1;
|
||||||
char *cp2, *dotptr;
|
char *cp2, *dotptr;
|
||||||
char expandbuf[NAME_SIZE];
|
char expandbuf[NAME_SIZE];
|
||||||
FILE *realf, *tmpf;
|
|
||||||
int tmpres;
|
int tmpres;
|
||||||
struct stat statb;
|
struct stat statb;
|
||||||
bool result, exists;
|
bool result, exists;
|
||||||
|
|
@ -3989,6 +3988,7 @@ DBCellWrite(cellDef, fileName)
|
||||||
tmpname = StrDup((char **)NULL, expandname);
|
tmpname = StrDup((char **)NULL, expandname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FILE *realf = NULL, *tmpf;
|
||||||
/*
|
/*
|
||||||
* See if we can create a temporary file in this directory.
|
* See if we can create a temporary file in this directory.
|
||||||
* If so, write to the temp file and then rename it after
|
* If so, write to the temp file and then rename it after
|
||||||
|
|
@ -4119,6 +4119,7 @@ DBCellWrite(cellDef, fileName)
|
||||||
#endif
|
#endif
|
||||||
realf = fopen(expandname, "r");
|
realf = fopen(expandname, "r");
|
||||||
|
|
||||||
|
bool do_close = FALSE;
|
||||||
if (realf == NULL)
|
if (realf == NULL)
|
||||||
{
|
{
|
||||||
cellDef->cd_flags |= CDMODIFIED;
|
cellDef->cd_flags |= CDMODIFIED;
|
||||||
|
|
@ -4135,15 +4136,26 @@ DBCellWrite(cellDef, fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FILE_LOCKS
|
#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;
|
cellDef->cd_fd = -1;
|
||||||
if (FileLocking && (is_locked == FALSE))
|
if (FileLocking && (is_locked == FALSE))
|
||||||
cellDef->cd_fd = fd;
|
cellDef->cd_fd = fd;
|
||||||
else if (FileLocking && (is_locked == TRUE))
|
else if (FileLocking && (is_locked == TRUE))
|
||||||
cellDef->cd_fd = -2;
|
cellDef->cd_fd = -2;
|
||||||
else
|
else
|
||||||
|
do_close = TRUE;
|
||||||
|
#else
|
||||||
|
do_close = TRUE;
|
||||||
#endif
|
#endif
|
||||||
fclose(realf);
|
|
||||||
}
|
}
|
||||||
|
if(do_close)
|
||||||
|
fclose(realf);
|
||||||
|
/* invalidate even if we don't close to ensure cleanup below does not close */
|
||||||
realf = NULL;
|
realf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4151,6 +4163,8 @@ cleanup:
|
||||||
SigEnableInterrupts();
|
SigEnableInterrupts();
|
||||||
freeMagic(realname);
|
freeMagic(realname);
|
||||||
freeMagic(tmpname);
|
freeMagic(tmpname);
|
||||||
|
if(realf)
|
||||||
|
fclose(realf);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue