diff options
author | Tatsuo Ishii <ishii@postgresql.org> | 2018-06-16 14:21:08 +0900 |
---|---|---|
committer | Tatsuo Ishii <ishii@postgresql.org> | 2018-06-16 14:21:08 +0900 |
commit | 1cfdb1cb0e3f0acd0fac11537410c48dfd6d9075 (patch) | |
tree | a6fb15def718738117e60e05555d44cf559a50ff /src/backend/storage/file/buffile.c | |
parent | ff03112bdc70541382b39fa4e36b9a9ad93b4b73 (diff) | |
download | postgresql-1cfdb1cb0e3f0acd0fac11537410c48dfd6d9075.tar.gz postgresql-1cfdb1cb0e3f0acd0fac11537410c48dfd6d9075.zip |
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
Diffstat (limited to 'src/backend/storage/file/buffile.c')
-rw-r--r-- | src/backend/storage/file/buffile.c | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 00f61748b34..efbede76297 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); |