mirror of
https://github.com/postgres/postgres.git
synced 2026-04-22 14:47:29 -04:00
Avoid memory leak on error while parsing pg_stat_statements dump file
By using palloc() instead of raw malloc(). Reported-by: Gaurav Singh <gaurav.singh@yugabyte.com> Reviewed-by: Lukas Fittl <lukas@fittl.com> Reviewed-by: Daniel Gustafsson <daniel@yesql.se> Discussion: https://www.postgresql.org/message-id/CAEcQ1bYR9s4eQLFDjzzJHU8fj-MTbmRpW-9J-r2gsCn+HEsynw@mail.gmail.com Backpatch-through: 14
This commit is contained in:
parent
f421050015
commit
52edaf9d9b
1 changed files with 13 additions and 9 deletions
|
|
@ -784,7 +784,7 @@ pgss_shmem_shutdown(int code, Datum arg)
|
|||
if (fwrite(&pgss->stats, sizeof(pgssGlobalStats), 1, file) != 1)
|
||||
goto error;
|
||||
|
||||
free(qbuffer);
|
||||
pfree(qbuffer);
|
||||
qbuffer = NULL;
|
||||
|
||||
if (FreeFile(file))
|
||||
|
|
@ -808,7 +808,8 @@ error:
|
|||
(errcode_for_file_access(),
|
||||
errmsg("could not write file \"%s\": %m",
|
||||
PGSS_DUMP_FILE ".tmp")));
|
||||
free(qbuffer);
|
||||
if (qbuffer)
|
||||
pfree(qbuffer);
|
||||
if (file)
|
||||
FreeFile(file);
|
||||
unlink(PGSS_DUMP_FILE ".tmp");
|
||||
|
|
@ -1669,7 +1670,8 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo,
|
|||
pgss->extent != extent ||
|
||||
pgss->gc_count != gc_count)
|
||||
{
|
||||
free(qbuffer);
|
||||
if (qbuffer)
|
||||
pfree(qbuffer);
|
||||
qbuffer = qtext_load_file(&qbuffer_size);
|
||||
}
|
||||
}
|
||||
|
|
@ -1853,7 +1855,8 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo,
|
|||
|
||||
LWLockRelease(pgss->lock);
|
||||
|
||||
free(qbuffer);
|
||||
if (qbuffer)
|
||||
pfree(qbuffer);
|
||||
}
|
||||
|
||||
/* Number of output arguments (columns) for pg_stat_statements_info */
|
||||
|
|
@ -2158,7 +2161,7 @@ error:
|
|||
}
|
||||
|
||||
/*
|
||||
* Read the external query text file into a malloc'd buffer.
|
||||
* Read the external query text file into a palloc'd buffer.
|
||||
*
|
||||
* Returns NULL (without throwing an error) if unable to read, eg
|
||||
* file not there or insufficient memory.
|
||||
|
|
@ -2200,7 +2203,7 @@ qtext_load_file(Size *buffer_size)
|
|||
|
||||
/* Allocate buffer; beware that off_t might be wider than size_t */
|
||||
if (stat.st_size <= MaxAllocHugeSize)
|
||||
buf = (char *) malloc(stat.st_size);
|
||||
buf = (char *) palloc_extended(stat.st_size, MCXT_ALLOC_HUGE | MCXT_ALLOC_NO_OOM);
|
||||
else
|
||||
buf = NULL;
|
||||
if (buf == NULL)
|
||||
|
|
@ -2239,7 +2242,7 @@ qtext_load_file(Size *buffer_size)
|
|||
(errcode_for_file_access(),
|
||||
errmsg("could not read file \"%s\": %m",
|
||||
PGSS_TEXT_FILE)));
|
||||
free(buf);
|
||||
pfree(buf);
|
||||
CloseTransientFile(fd);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -2454,7 +2457,7 @@ gc_qtexts(void)
|
|||
else
|
||||
pgss->mean_query_len = ASSUMED_LENGTH_INIT;
|
||||
|
||||
free(qbuffer);
|
||||
pfree(qbuffer);
|
||||
|
||||
/*
|
||||
* OK, count a garbage collection cycle. (Note: even though we have
|
||||
|
|
@ -2471,7 +2474,8 @@ gc_fail:
|
|||
/* clean up resources */
|
||||
if (qfile)
|
||||
FreeFile(qfile);
|
||||
free(qbuffer);
|
||||
if (qbuffer)
|
||||
pfree(qbuffer);
|
||||
|
||||
/*
|
||||
* Since the contents of the external file are now uncertain, mark all
|
||||
|
|
|
|||
Loading…
Reference in a new issue