Remove memory leaks in isolationtester.

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.
This commit is contained in:
Tom Lane 2021-06-27 12:45:04 -04:00
parent 88274a7a31
commit 2d09448654
2 changed files with 19 additions and 9 deletions

View File

@ -52,8 +52,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);
@ -360,9 +360,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
@ -387,6 +387,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;
@ -412,11 +413,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;
@ -438,7 +444,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]--;

View 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!) */