]> granicus.if.org Git - postgresql/commitdiff
Fix memory leak in BufFileCreateShared().
authorTatsuo Ishii <ishii@postgresql.org>
Sat, 16 Jun 2018 05:21:08 +0000 (14:21 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Sat, 16 Jun 2018 05:21:08 +0000 (14:21 +0900)
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

src/backend/storage/file/buffile.c

index 00f61748b347bae9578ee77bd62deaa88e23ddc6..efbede76297269947ceeee3ac03b122d9e1e4641 100644 (file)
@@ -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);