From: Tatsuo Ishii Date: Sat, 16 Jun 2018 05:21:08 +0000 (+0900) Subject: Fix memory leak in BufFileCreateShared(). X-Git-Tag: REL_11_BETA2~52 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1cfdb1cb0e3f0acd0fac11537410c48dfd6d9075;p=postgresql 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 --- diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 00f61748b3..efbede7629 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -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,21 +107,16 @@ static void BufFileDumpBuffer(BufFile *file); static int BufFileFlush(BufFile *file); static File MakeNewSharedSegment(BufFile *file, int segment); - /* - * Create a BufFile given the first underlying physical file. - * NOTE: caller must set isInterXact if appropriate. + * Create BufFile and perform the common initialization. */ static BufFile * -makeBufFile(File firstfile) +makeBufFileCommon(int nfiles) { BufFile *file = (BufFile *) palloc(sizeof(BufFile)); - 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->numFiles = nfiles; + file->offsets = (off_t *) palloc0(sizeof(off_t) * nfiles); file->isInterXact = false; file->dirty = false; file->resowner = CurrentResourceOwner; @@ -128,6 +124,21 @@ makeBufFile(File firstfile) file->curOffset = 0L; file->pos = 0; file->nbytes = 0; + + return file; +} + +/* + * Create a BufFile given the first underlying physical file. + * NOTE: caller must set isInterXact if appropriate. + */ +static BufFile * +makeBufFile(File firstfile) +{ + BufFile *file = makeBufFileCommon(1); + + file->files = (File *) palloc(sizeof(File)); + file->files[0] = firstfile; 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);