]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Remove memory leaks in isolationtester.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Jun 2021 16:45:04 +0000 (12:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Jun 2021 16:45:04 +0000 (12:45 -0400)
specscanner.l leaked a kilobyte of memory per token of the spec file.
Apparently somebody thought that the introductory code block would be
executed once; but it's once per yylex() call.

A couple of functions in isolationtester.c leaked small amounts of
memory due to not bothering to free one-time allocations.  Might
as well improve these so that valgrind gives this program a clean
bill of health.  Also get rid of an ugly static variable.

Coverity complained about one of the one-time leaks, which led me
to try valgrind'ing isolationtester, which led to discovery of the
larger leak.

src/test/isolation/isolationtester.c
src/test/isolation/specscanner.l

index b9f06f4a1d7f4d320c3c7f695f9b321b991301cc..72ef804ce300412a861b7d9e3518339110e33d56 100644 (file)
@@ -53,8 +53,8 @@ static int64 max_step_wait = 300 * USECS_PER_SEC;
 static void check_testspec(TestSpec *testspec);
 static void run_testspec(TestSpec *testspec);
 static void run_all_permutations(TestSpec *testspec);
-static void run_all_permutations_recurse(TestSpec *testspec, int nsteps,
-                                                                                PermutationStep **steps);
+static void run_all_permutations_recurse(TestSpec *testspec, int *piles,
+                                                                                int nsteps, PermutationStep **steps);
 static void run_named_permutations(TestSpec *testspec);
 static void run_permutation(TestSpec *testspec, int nsteps,
                                                        PermutationStep **steps);
@@ -361,9 +361,9 @@ check_testspec(TestSpec *testspec)
                                fprintf(stderr, "unused step name: %s\n", allsteps[i]->name);
                }
        }
-}
 
-static int *piles;
+       free(allsteps);
+}
 
 /*
  * Run the permutations specified in the spec, or all if none were
@@ -388,6 +388,7 @@ run_all_permutations(TestSpec *testspec)
        int                     i;
        PermutationStep *steps;
        PermutationStep **stepptrs;
+       int                *piles;
 
        /* Count the total number of steps in all sessions */
        nsteps = 0;
@@ -413,11 +414,16 @@ run_all_permutations(TestSpec *testspec)
        for (i = 0; i < testspec->nsessions; i++)
                piles[i] = 0;
 
-       run_all_permutations_recurse(testspec, 0, stepptrs);
+       run_all_permutations_recurse(testspec, piles, 0, stepptrs);
+
+       free(steps);
+       free(stepptrs);
+       free(piles);
 }
 
 static void
-run_all_permutations_recurse(TestSpec *testspec, int nsteps, PermutationStep **steps)
+run_all_permutations_recurse(TestSpec *testspec, int *piles,
+                                                        int nsteps, PermutationStep **steps)
 {
        int                     i;
        bool            found = false;
@@ -439,7 +445,7 @@ run_all_permutations_recurse(TestSpec *testspec, int nsteps, PermutationStep **s
 
                        piles[i]++;
 
-                       run_all_permutations_recurse(testspec, nsteps + 1, steps);
+                       run_all_permutations_recurse(testspec, piles, nsteps + 1, steps);
 
                        piles[i]--;
 
index cb27bfbe596bd7bd24c92b9d261c18ef6906de2c..e34541c9d2c4f7fdc8e3d2a4525df7fff27b529d 100644 (file)
@@ -52,8 +52,12 @@ self                 [,()*]
 %%
 
 %{
-       litbuf = pg_malloc(LITBUF_INIT);
-       litbufsize = LITBUF_INIT;
+       /* Allocate litbuf in first call of yylex() */
+       if (litbuf == NULL)
+       {
+               litbuf = pg_malloc(LITBUF_INIT);
+               litbufsize = LITBUF_INIT;
+       }
 %}
 
  /* Keywords (must appear before the {identifier} rule!) */