mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix memory leak in BufFileCreateShared().
Also this commit unifies some duplicated code in makeBufFile() and BufFileOpenShared() into new function makeBufFileCommon(). Author: Antonin Houska Reviewed-By: Thomas Munro, Tatsuo Ishii Discussion: https://postgr.es/m/16139.1529049566%40localhost
This commit is contained in:
		@@ -99,6 +99,7 @@ struct BufFile
 | 
			
		||||
	char		buffer[BLCKSZ];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static BufFile *makeBufFileCommon(int nfiles);
 | 
			
		||||
static BufFile *makeBufFile(File firstfile);
 | 
			
		||||
static void extendBufFile(BufFile *file);
 | 
			
		||||
static void BufFileLoadBuffer(BufFile *file);
 | 
			
		||||
@@ -106,6 +107,26 @@ static void BufFileDumpBuffer(BufFile *file);
 | 
			
		||||
static int	BufFileFlush(BufFile *file);
 | 
			
		||||
static File MakeNewSharedSegment(BufFile *file, int segment);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Create BufFile and perform the common initialization.
 | 
			
		||||
 */
 | 
			
		||||
static BufFile *
 | 
			
		||||
makeBufFileCommon(int nfiles)
 | 
			
		||||
{
 | 
			
		||||
	BufFile    *file = (BufFile *) palloc(sizeof(BufFile));
 | 
			
		||||
 | 
			
		||||
	file->numFiles = nfiles;
 | 
			
		||||
	file->offsets = (off_t *) palloc0(sizeof(off_t) * nfiles);
 | 
			
		||||
	file->isInterXact = false;
 | 
			
		||||
	file->dirty = false;
 | 
			
		||||
	file->resowner = CurrentResourceOwner;
 | 
			
		||||
	file->curFile = 0;
 | 
			
		||||
	file->curOffset = 0L;
 | 
			
		||||
	file->pos = 0;
 | 
			
		||||
	file->nbytes = 0;
 | 
			
		||||
 | 
			
		||||
	return file;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Create a BufFile given the first underlying physical file.
 | 
			
		||||
@@ -114,20 +135,10 @@ static File MakeNewSharedSegment(BufFile *file, int segment);
 | 
			
		||||
static BufFile *
 | 
			
		||||
makeBufFile(File firstfile)
 | 
			
		||||
{
 | 
			
		||||
	BufFile    *file = (BufFile *) palloc(sizeof(BufFile));
 | 
			
		||||
	BufFile    *file = makeBufFileCommon(1);
 | 
			
		||||
 | 
			
		||||
	file->numFiles = 1;
 | 
			
		||||
	file->files = (File *) palloc(sizeof(File));
 | 
			
		||||
	file->files[0] = firstfile;
 | 
			
		||||
	file->offsets = (off_t *) palloc(sizeof(off_t));
 | 
			
		||||
	file->offsets[0] = 0L;
 | 
			
		||||
	file->isInterXact = false;
 | 
			
		||||
	file->dirty = false;
 | 
			
		||||
	file->resowner = CurrentResourceOwner;
 | 
			
		||||
	file->curFile = 0;
 | 
			
		||||
	file->curOffset = 0L;
 | 
			
		||||
	file->pos = 0;
 | 
			
		||||
	file->nbytes = 0;
 | 
			
		||||
	file->readOnly = false;
 | 
			
		||||
	file->fileset = NULL;
 | 
			
		||||
	file->name = NULL;
 | 
			
		||||
@@ -246,23 +257,12 @@ BufFileCreateShared(SharedFileSet *fileset, const char *name)
 | 
			
		||||
{
 | 
			
		||||
	BufFile    *file;
 | 
			
		||||
 | 
			
		||||
	file = (BufFile *) palloc(sizeof(BufFile));
 | 
			
		||||
	file = makeBufFileCommon(1);
 | 
			
		||||
	file->fileset = fileset;
 | 
			
		||||
	file->name = pstrdup(name);
 | 
			
		||||
	file->numFiles = 1;
 | 
			
		||||
	file->files = (File *) palloc(sizeof(File));
 | 
			
		||||
	file->files[0] = MakeNewSharedSegment(file, 0);
 | 
			
		||||
	file->offsets = (off_t *) palloc(sizeof(off_t));
 | 
			
		||||
	file->offsets[0] = 0L;
 | 
			
		||||
	file->isInterXact = false;
 | 
			
		||||
	file->dirty = false;
 | 
			
		||||
	file->resowner = CurrentResourceOwner;
 | 
			
		||||
	file->curFile = 0;
 | 
			
		||||
	file->curOffset = 0L;
 | 
			
		||||
	file->pos = 0;
 | 
			
		||||
	file->nbytes = 0;
 | 
			
		||||
	file->readOnly = false;
 | 
			
		||||
	file->name = pstrdup(name);
 | 
			
		||||
 | 
			
		||||
	return file;
 | 
			
		||||
}
 | 
			
		||||
@@ -283,7 +283,6 @@ BufFileOpenShared(SharedFileSet *fileset, const char *name)
 | 
			
		||||
	File	   *files;
 | 
			
		||||
	int			nfiles = 0;
 | 
			
		||||
 | 
			
		||||
	file = (BufFile *) palloc(sizeof(BufFile));
 | 
			
		||||
	files = palloc(sizeof(File) * capacity);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
@@ -317,16 +316,8 @@ BufFileOpenShared(SharedFileSet *fileset, const char *name)
 | 
			
		||||
				(errcode_for_file_access(),
 | 
			
		||||
				 errmsg("could not open BufFile \"%s\"", name)));
 | 
			
		||||
 | 
			
		||||
	file->numFiles = nfiles;
 | 
			
		||||
	file = makeBufFileCommon(nfiles);
 | 
			
		||||
	file->files = files;
 | 
			
		||||
	file->offsets = (off_t *) palloc0(sizeof(off_t) * nfiles);
 | 
			
		||||
	file->isInterXact = false;
 | 
			
		||||
	file->dirty = false;
 | 
			
		||||
	file->resowner = CurrentResourceOwner;	/* Unused, can't extend */
 | 
			
		||||
	file->curFile = 0;
 | 
			
		||||
	file->curOffset = 0L;
 | 
			
		||||
	file->pos = 0;
 | 
			
		||||
	file->nbytes = 0;
 | 
			
		||||
	file->readOnly = true;		/* Can't write to files opened this way */
 | 
			
		||||
	file->fileset = fileset;
 | 
			
		||||
	file->name = pstrdup(name);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user