0001-Avoid-memory-leak-on-error-while-parsing-pg_stat_sta.patch
text/x-patch
Filename: 0001-Avoid-memory-leak-on-error-while-parsing-pg_stat_sta.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: Avoid memory leak on error while parsing pg_stat_statements dump file
| File | + | − |
|---|---|---|
| contrib/pg_stat_statements/pg_stat_statements.c | 13 | 9 |
From a88fdd79e0131a25141f5efd84246026b3b7f6ff Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Fri, 27 Mar 2026 10:52:04 +0200
Subject: [PATCH 1/1] 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>
Discussion: https://www.postgresql.org/message-id/CAEcQ1bYR9s4eQLFDjzzJHU8fj-MTbmRpW-9J-r2gsCn+HEsynw@mail.gmail.com
---
.../pg_stat_statements/pg_stat_statements.c | 22 +++++++++++--------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index 6cb14824ec3..7975476b890 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -805,7 +805,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))
@@ -829,7 +829,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");
@@ -1825,7 +1826,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);
}
}
@@ -2046,7 +2048,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 */
@@ -2333,7 +2336,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.
@@ -2375,7 +2378,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)
@@ -2414,7 +2417,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;
}
@@ -2625,7 +2628,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
@@ -2642,7 +2645,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
--
2.47.3