On Thu May 7, 2026 at 10:01 PM UTC, Zsolt Parragi wrote:
> Hello!
>
> There are many cases missed by the script, for example:
>
> tab-complete.in.c:7089:
>
> `previous_words = pg_malloc_array(char *, point);`
>
> tab-complete.in.c:6364:
>
> `completion_ref_object = pg_strdup(word);`
>
> tab-complete.in.c:7090:
>
> `*buffer = (char *) pg_malloc(point * 2);`
>
> There's also completion_ref_schema, which is an out parameter of
> parse_identifier, still freed in the patch.
Thanks. I have adjusted the script to cover these instances, and fixed
the patch in v2.
> The strtokx change in stringutils.c is also strange - the patch
> converts one free at line 96, and leaves the same free a few lines
> above at line 73 as is.
Thanks. Fixed this as well in the script. Fixed in v2.
>> I generated the patch with the help of Coccinelle[0]. I'm no expert with
>> Coccinelle, but it seemed like a good candidate to get this refactor
>> done. You can run the attached script in your tree with the following
>> command:
>
> If I had to do it, I would try to approach this with static analysis
> tools instead: a custom rule that enforces attribute declarations for
> return values / output parameters allocated by pg_malloc and similar
> functions. Without attributes everywhere, these checks will never be
> complete because tools won't be able to fully reason about cross
> source file call paths.
> For example clang-tidy even has an auto fix mode that could apply
> these attributes automatically.
>
> With the attributes in place, we would automatically receive warnings
> for every incorrect free attribute, which a tool could then
> automatically fix.
This would be nice. GCC already has some of this functionality:
__attribute__((malloc(pfree))). When you add the deallocator, GCC will
warn: -Wmismatched-dealloc. Perhaps there was some confusion in my
initial proposal. I cannot confirm if this patch fixes every instance,
but what it does do is get all my __attribute__((malloc)) additions
added to the codebase without causing additional compiler warning noise,
which would be a prerequisite to committing the __attribute__((malloc))
additions. I would think that as GCC continues to evolve, we could get
even more warnings generated to help us find further issues with
mismatched deallocation functions.
> If we want to avoid generating noise by placing attributes everywhere
> in the source (I'm not sure how noisy that would be), that part could
> be a specialized CI run instead, since the transformation itself can
> be automated.
The current size of my attribute patch is not very noisy at all:
src/include/c.h | 12 ++++++++++++
src/include/common/fe_memutils.h | 36
++++++++++++++++++------------------
src/include/utils/palloc.h | 30 +++++++++++++++---------------
3 files changed, 45 insertions(+), 33 deletions(-)
I would advocate for adding the attributes, which is why I have
submitted this preliminary patch. In addition to -Wmismatched-dealloc,
GCC also can use -Wfree-nonheap-object, when the attributes are present.
Attached you will find v2 of the patch and v2 of the Coccinelle script.
For more reading on __attribute__((malloc)), see the GCC documentation:
https://gcc.gnu.org/onlinedocs/gcc/Common-Attributes.html#index-malloc.
--
Tristan Partin
PostgreSQL Contributors Team
AWS (https://aws.amazon.com)
From bf9732c7c7af6ed6eeb23010287a9c4096133b2c Mon Sep 17 00:00:00 2001
From: Tristan Partin <[email protected]>
Date: Wed, 6 May 2026 21:58:16 +0000
Subject: [PATCH v2] Fix mismatched deallocation functions
In fe_memutils.h, we have various allocation functions beginning with
either pg_ or p. The pg_ functions have a matching pg_free() for freeing
memory, while the p functions use pfree(). In some cases, we were
allocating memory with one set of functions while using the wrong
deallocation functions. This creates a tiny bit of mental overhead when
reading code. Matching up allocation and deallocation functions makes it
easier to analyze memory handling in a code path.
Signed-off-by: Tristan Partin <[email protected]>
---
contrib/oid2name/oid2name.c | 6 +-
src/bin/initdb/initdb.c | 14 +-
src/bin/pg_basebackup/pg_basebackup.c | 4 +-
src/bin/pg_basebackup/pg_createsubscriber.c | 10 +-
src/bin/pg_basebackup/streamutil.c | 8 +-
src/bin/pg_combinebackup/load_manifest.c | 2 +-
src/bin/pg_combinebackup/pg_combinebackup.c | 2 +-
src/bin/pg_combinebackup/reconstruct.c | 8 +-
src/bin/pg_ctl/pg_ctl.c | 10 +-
src/bin/pg_dump/compress_gzip.c | 8 +-
src/bin/pg_dump/compress_lz4.c | 2 +-
src/bin/pg_dump/compress_none.c | 2 +-
src/bin/pg_dump/connectdb.c | 12 +-
src/bin/pg_dump/dumputils.c | 4 +-
src/bin/pg_dump/parallel.c | 2 +-
src/bin/pg_dump/pg_backup_archiver.c | 28 ++--
src/bin/pg_dump/pg_backup_custom.c | 4 +-
src/bin/pg_dump/pg_backup_db.c | 4 +-
src/bin/pg_dump/pg_backup_directory.c | 2 +-
src/bin/pg_dump/pg_backup_tar.c | 6 +-
src/bin/pg_dump/pg_dump.c | 128 +++++++++---------
src/bin/pg_dump/pg_dump_sort.c | 12 +-
src/bin/pg_dump/pg_dumpall.c | 6 +-
src/bin/pg_upgrade/check.c | 8 +-
src/bin/pg_upgrade/function.c | 2 +-
src/bin/pg_verifybackup/pg_verifybackup.c | 4 +-
src/bin/pgbench/pgbench.c | 4 +-
src/bin/psql/command.c | 10 +-
src/bin/psql/common.c | 4 +-
src/bin/psql/describe.c | 14 +-
src/bin/psql/help.c | 2 +-
src/bin/psql/input.c | 2 +-
src/bin/psql/large_obj.c | 4 +-
src/bin/psql/mainloop.c | 12 +-
src/bin/psql/prompt.c | 4 +-
src/bin/psql/startup.c | 14 +-
src/bin/psql/stringutils.c | 6 +-
src/bin/psql/tab-complete.in.c | 18 +--
src/bin/scripts/vacuuming.c | 2 +-
src/common/logging.c | 2 +-
src/fe_utils/print.c | 34 ++---
src/interfaces/ecpg/test/pg_regress_ecpg.c | 2 +-
src/test/isolation/isolation_main.c | 2 +-
src/test/isolation/isolationtester.c | 10 +-
.../modules/libpq_pipeline/libpq_pipeline.c | 8 +-
src/test/regress/pg_regress.c | 6 +-
src/test/regress/pg_regress_main.c | 2 +-
47 files changed, 230 insertions(+), 230 deletions(-)
diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c
index 1e9efcd395..fbe923370a 100644
--- a/contrib/oid2name/oid2name.c
+++ b/contrib/oid2name/oid2name.c
@@ -427,7 +427,7 @@ sql_exec(PGconn *conn, const char *todo, bool quiet)
memset(pad, '-', l);
pad[l] = '\0';
fprintf(stdout, "%s\n", pad);
- free(pad);
+ pg_free(pad);
}
/* for each row, dump the information */
@@ -440,7 +440,7 @@ sql_exec(PGconn *conn, const char *todo, bool quiet)
/* cleanup */
PQclear(res);
- free(length);
+ pg_free(length);
return 0;
}
@@ -562,7 +562,7 @@ sql_exec_searchtables(PGconn *conn, struct options *opts)
opts->extended ? addfields : "",
qualifiers);
- free(qualifiers);
+ pg_free(qualifiers);
sql_exec(conn, todo, opts->quiet);
}
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 14cb79c26b..eb41be5ab9 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -983,12 +983,12 @@ find_matching_ts_config(const char *lc_type)
{
if (pg_strcasecmp(tsearch_config_languages[i].langname, langname) == 0)
{
- free(langname);
+ pg_free(langname);
return tsearch_config_languages[i].tsconfname;
}
}
- free(langname);
+ pg_free(langname);
return NULL;
}
@@ -1052,7 +1052,7 @@ write_version_file(const char *extrapath)
if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 ||
fclose(version_file))
pg_fatal("could not write file \"%s\": %m", path);
- free(path);
+ pfree(path);
}
/*
@@ -1071,7 +1071,7 @@ set_null_conf(void)
pg_fatal("could not open file \"%s\" for writing: %m", path);
if (fclose(conf_file))
pg_fatal("could not write file \"%s\": %m", path);
- free(path);
+ pfree(path);
}
/*
@@ -3048,7 +3048,7 @@ create_xlog_or_symlink(void)
subdirloc);
}
- free(subdirloc);
+ pfree(subdirloc);
}
@@ -3103,7 +3103,7 @@ initialize_data_directory(void)
if (mkdir(path, pg_dir_create_mode) < 0)
pg_fatal("could not create directory \"%s\": %m", path);
- free(path);
+ pfree(path);
}
check_ok();
@@ -3303,7 +3303,7 @@ main(int argc, char *argv[])
*equals++ = '\0'; /* terminate variable name */
add_stringlist_item(&extra_guc_names, buf);
add_stringlist_item(&extra_guc_values, equals);
- pfree(buf);
+ pg_free(buf);
}
break;
case 'D':
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 80dc3bbc8d..c82852e6be 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -796,7 +796,7 @@ progress_update_filename(const char *filename)
/* We needn't maintain this variable if not doing verbose reports. */
if (showprogress && verbose)
{
- free(progress_filename);
+ pg_free(progress_filename);
if (filename)
progress_filename = pg_strdup(filename);
else
@@ -2857,7 +2857,7 @@ main(int argc, char **argv)
if (symlink(xlog_dir, linkloc) != 0)
pg_fatal("could not create symbolic link \"%s\": %m", linkloc);
- free(linkloc);
+ pfree(linkloc);
}
BaseBackup(compression_algorithm, compression_detail, compressloc,
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c
index cb16a60800..f0a65af581 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -758,7 +758,7 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
cmd_str = psprintf("\"%s\" -D \"%s\" >> \"%s\"", pg_resetwal_path,
subscriber_dir, out_file);
if (opt->log_dir)
- pg_free(out_file);
+ pfree(out_file);
pg_log_debug("pg_resetwal command is: %s", cmd_str);
@@ -773,7 +773,7 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
}
pg_free(cf);
- pg_free(cmd_str);
+ pfree(cmd_str);
}
/*
@@ -2128,8 +2128,8 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
PQfreemem(subname);
PQfreemem(dbname);
- pg_free(originname);
- pg_free(lsnstr);
+ pfree(originname);
+ pfree(lsnstr);
destroyPQExpBuffer(str);
}
@@ -2513,7 +2513,7 @@ main(int argc, char **argv)
if (!internal_log_file_fp)
pg_fatal("could not open log file \"%s\": %m", internal_log_file);
- pg_free(internal_log_file);
+ pfree(internal_log_file);
pg_logging_set_logfile(internal_log_file_fp);
}
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 76abdfa2ae..b5d3351dd3 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -203,15 +203,15 @@ GetConnection(void)
{
pg_log_error("%s", PQerrorMessage(tmpconn));
PQfinish(tmpconn);
- free(values);
- free(keywords);
+ pg_free(values);
+ pg_free(keywords);
PQconninfoFree(conn_opts);
return NULL;
}
/* Connection ok! */
- free(values);
- free(keywords);
+ pg_free(values);
+ pg_free(keywords);
PQconninfoFree(conn_opts);
/*
diff --git a/src/bin/pg_combinebackup/load_manifest.c b/src/bin/pg_combinebackup/load_manifest.c
index 021fd3ffa1..1a3eb99c10 100644
--- a/src/bin/pg_combinebackup/load_manifest.c
+++ b/src/bin/pg_combinebackup/load_manifest.c
@@ -214,7 +214,7 @@ load_backup_manifest(char *backup_directory)
}
/* All done. */
- pfree(buffer);
+ pg_free(buffer);
return result;
}
diff --git a/src/bin/pg_combinebackup/pg_combinebackup.c b/src/bin/pg_combinebackup/pg_combinebackup.c
index d13bf63eb1..43ea2f4f10 100644
--- a/src/bin/pg_combinebackup/pg_combinebackup.c
+++ b/src/bin/pg_combinebackup/pg_combinebackup.c
@@ -1159,7 +1159,7 @@ process_directory_recursively(Oid tsoid,
/* Avoid leaking memory. */
if (checksum_payload != NULL)
- pfree(checksum_payload);
+ pg_free(checksum_payload);
}
closedir(dir);
diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c
index 3349aa2441..2baf6656e1 100644
--- a/src/bin/pg_combinebackup/reconstruct.c
+++ b/src/bin/pg_combinebackup/reconstruct.c
@@ -372,9 +372,9 @@ reconstruct_from_incremental_file(char *input_filename,
pg_free(s->filename);
pg_free(s);
}
- pfree(sourcemap);
- pfree(offsetmap);
- pfree(source);
+ pg_free(sourcemap);
+ pg_free(offsetmap);
+ pg_free(source);
}
/*
@@ -518,7 +518,7 @@ make_rfile(char *filename, bool missing_ok)
{
if (missing_ok && errno == ENOENT)
{
- pg_free(rf->filename);
+ pfree(rf->filename);
pg_free(rf);
return NULL;
}
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index b5433a75d1..7dc6e1ad8f 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -357,7 +357,7 @@ readfile(const char *path, int *numlines)
if (len != statbuf.st_size)
{
/* oops, the file size changed between fstat and read */
- free(buffer);
+ pg_free(buffer);
return NULL;
}
@@ -398,7 +398,7 @@ readfile(const char *path, int *numlines)
}
result[n] = NULL;
- free(buffer);
+ pg_free(buffer);
return result;
}
@@ -2168,12 +2168,12 @@ adjust_data_dir(void)
write_stderr(_("%s: could not determine the data directory using command \"%s\"\n"), progname, cmd);
exit(1);
}
- free(my_exec_path);
+ pg_free(my_exec_path);
/* strip trailing newline and carriage return */
(void) pg_strip_crlf(filename);
- free(pg_data);
+ pg_free(pg_data);
pg_data = pg_strdup(filename);
canonicalize_path(pg_data);
}
@@ -2288,7 +2288,7 @@ main(int argc, char **argv)
* but we do -D too for clearer postmaster 'ps' display
*/
pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
- free(pgdata_D);
+ pg_free(pgdata_D);
break;
}
case 'e':
diff --git a/src/bin/pg_dump/compress_gzip.c b/src/bin/pg_dump/compress_gzip.c
index 60c553ba25..bd1043b236 100644
--- a/src/bin/pg_dump/compress_gzip.c
+++ b/src/bin/pg_dump/compress_gzip.c
@@ -229,9 +229,9 @@ ReadDataFromArchiveGzip(ArchiveHandle *AH, CompressorState *cs)
if (inflateEnd(zp) != Z_OK)
pg_fatal("could not close compression library: %s", zp->msg);
- free(buf);
- free(out);
- free(zp);
+ pg_free(buf);
+ pg_free(out);
+ pg_free(zp);
}
/* Public routines that support gzip compressed data I/O */
@@ -421,7 +421,7 @@ Gzip_open_write(const char *path, const char *mode, CompressFileHandle *CFH)
ret = CFH->open_func(fname, -1, mode, CFH);
save_errno = errno;
- pg_free(fname);
+ pfree(fname);
errno = save_errno;
return ret;
diff --git a/src/bin/pg_dump/compress_lz4.c b/src/bin/pg_dump/compress_lz4.c
index 0a7872116e..500d5e16a6 100644
--- a/src/bin/pg_dump/compress_lz4.c
+++ b/src/bin/pg_dump/compress_lz4.c
@@ -755,7 +755,7 @@ LZ4Stream_open_write(const char *path, const char *mode, CompressFileHandle *CFH
ret = CFH->open_func(fname, -1, mode, CFH);
save_errno = errno;
- pg_free(fname);
+ pfree(fname);
errno = save_errno;
return ret;
diff --git a/src/bin/pg_dump/compress_none.c b/src/bin/pg_dump/compress_none.c
index 743e2ce94b..47bc6f1f3d 100644
--- a/src/bin/pg_dump/compress_none.c
+++ b/src/bin/pg_dump/compress_none.c
@@ -53,7 +53,7 @@ ReadDataFromArchiveNone(ArchiveHandle *AH, CompressorState *cs)
ahwrite(buf, 1, cnt, AH);
}
- free(buf);
+ pg_free(buf);
}
diff --git a/src/bin/pg_dump/connectdb.c b/src/bin/pg_dump/connectdb.c
index f3ce8b1cfb..b04076bf34 100644
--- a/src/bin/pg_dump/connectdb.c
+++ b/src/bin/pg_dump/connectdb.c
@@ -66,8 +66,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
char *err_msg = NULL;
int i = 0;
- free(keywords);
- free(values);
+ pg_free(keywords);
+ pg_free(values);
PQconninfoFree(conn_opts);
/*
@@ -176,8 +176,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
{
PQfinish(conn);
- free(keywords);
- free(values);
+ pg_free(keywords);
+ pg_free(values);
PQconninfoFree(conn_opts);
return NULL;
@@ -191,8 +191,8 @@ ConnectDatabase(const char *dbname, const char *connection_string,
if (connstr)
*connstr = constructConnStr(keywords, values);
- free(keywords);
- free(values);
+ pg_free(keywords);
+ pg_free(values);
PQconninfoFree(conn_opts);
/* Check version */
diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c
index dfb1f603a4..2dc9855098 100644
--- a/src/bin/pg_dump/dumputils.c
+++ b/src/bin/pg_dump/dumputils.c
@@ -343,8 +343,8 @@ buildACLCommands(const char *name, const char *subname, const char *nspname,
free(aclitems);
free(baseitems);
- free(grantitems);
- free(revokeitems);
+ pg_free(grantitems);
+ pg_free(revokeitems);
return ok;
}
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index a7bed5eccc..3e5e940d80 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -499,7 +499,7 @@ WaitForTerminatingWorkers(ParallelState *pstate)
ret = WaitForMultipleObjects(nrun, lpHandles, false, INFINITE);
Assert(ret != WAIT_FAILED);
hThread = (uintptr_t) lpHandles[ret - WAIT_OBJECT_0];
- free(lpHandles);
+ pg_free(lpHandles);
/* Find dead worker's slot, and clear the hThread field */
for (j = 0; j < pstate->numWorkers; j++)
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 2fd773ad84..61cd6bad77 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -1698,12 +1698,12 @@ archprintf(Archive *AH, const char *fmt, ...)
break; /* success */
/* Release buffer and loop around to try again with larger len. */
- free(p);
+ pg_free(p);
len = cnt;
}
WriteData(AH, p, cnt);
- free(p);
+ pg_free(p);
return (int) cnt;
}
@@ -1802,12 +1802,12 @@ ahprintf(ArchiveHandle *AH, const char *fmt, ...)
break; /* success */
/* Release buffer and loop around to try again with larger len. */
- free(p);
+ pg_free(p);
len = cnt;
}
ahwrite(p, 1, cnt, AH);
- free(p);
+ pg_free(p);
return (int) cnt;
}
@@ -2272,7 +2272,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
pg_log_debug("attempting to ascertain archive format");
- free(AH->lookahead);
+ pg_free(AH->lookahead);
AH->readHeader = 0;
AH->lookaheadSize = 512;
@@ -2865,7 +2865,7 @@ ReadToc(ArchiveHandle *AH)
}
else
{
- free(deps);
+ pg_free(deps);
te->dependencies = NULL;
te->nDeps = 0;
}
@@ -2925,7 +2925,7 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
pg_fatal("invalid ENCODING item: %s",
te->defn);
- free(defn);
+ pg_free(defn);
}
static void
@@ -3610,7 +3610,7 @@ _becomeUser(ArchiveHandle *AH, const char *user)
* NOTE: currUser keeps track of what the imaginary session user in our
* script is
*/
- free(AH->currUser);
+ pg_free(AH->currUser);
AH->currUser = pg_strdup(user);
}
@@ -3675,7 +3675,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
else
ahprintf(AH, "%s;\n\n", qry->data);
- free(AH->currSchema);
+ pg_free(AH->currSchema);
AH->currSchema = pg_strdup(schemaName);
destroyPQExpBuffer(qry);
@@ -3736,7 +3736,7 @@ _selectTablespace(ArchiveHandle *AH, const char *tablespace)
else
ahprintf(AH, "%s;\n\n", qry->data);
- free(AH->currTablespace);
+ pg_free(AH->currTablespace);
AH->currTablespace = pg_strdup(want);
destroyPQExpBuffer(qry);
@@ -3787,7 +3787,7 @@ _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam)
destroyPQExpBuffer(cmd);
- free(AH->currTableAm);
+ pg_free(AH->currTableAm);
AH->currTableAm = pg_strdup(want);
}
@@ -3908,7 +3908,7 @@ _getObjectDescription(PQExpBuffer buf, const TocEntry *te)
appendPQExpBufferStr(buf, first);
- free(first);
+ pg_free(first);
return;
}
/* these object types don't have separate owners */
@@ -4124,7 +4124,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, const char *pfx)
char *cmdEnd = psprintf(" OWNER TO %s", fmtId(te->owner));
IssueCommandPerBlob(AH, te, "ALTER LARGE OBJECT ", cmdEnd);
- pg_free(cmdEnd);
+ pfree(cmdEnd);
}
else
{
@@ -5104,7 +5104,7 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
if (nlockids == 0)
{
- free(lockids);
+ pg_free(lockids);
return;
}
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index b2062d796f..ab1954c331 100644
--- a/src/bin/pg_dump/pg_backup_custom.c
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -645,7 +645,7 @@ _skipData(ArchiveHandle *AH)
{
if (blkLen > buflen)
{
- free(buf);
+ pg_free(buf);
buflen = Max(blkLen, 4 * 1024);
buf = (char *) pg_malloc(buflen);
}
@@ -661,7 +661,7 @@ _skipData(ArchiveHandle *AH)
blkLen = ReadInt(AH);
}
- free(buf);
+ pg_free(buf);
}
/*
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 5c349279be..ec0ddf1d71 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -143,7 +143,7 @@ ConnectDatabaseAhx(Archive *AHX,
*/
if (PQconnectionUsedPassword(AH->connection))
{
- free(AH->savedPassword);
+ pg_free(AH->savedPassword);
AH->savedPassword = pg_strdup(PQpass(AH->connection));
}
@@ -425,7 +425,7 @@ ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
memcpy(str, buf, bufLen);
str[bufLen] = '\0';
ExecuteSqlCommand(AH, str, "could not execute query");
- free(str);
+ pg_free(str);
}
}
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index 562868cd2a..c0b50223ce 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -365,7 +365,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename)
ahwrite(buf, 1, cnt, AH);
}
- free(buf);
+ pg_free(buf);
if (!EndCompressFileHandle(CFH))
pg_fatal("could not close data file \"%s\": %m", filename);
}
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index ae3a7c80cb..042e210b7f 100644
--- a/src/bin/pg_dump/pg_backup_tar.c
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -975,12 +975,12 @@ tarPrintf(TAR_MEMBER *th, const char *fmt, ...)
break; /* success */
/* Release buffer and loop around to try again with larger len. */
- free(p);
+ pg_free(p);
len = cnt;
}
cnt = tarWrite(p, cnt, th);
- free(p);
+ pg_free(p);
return (int) cnt;
}
@@ -1076,7 +1076,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
* We're just scanning the archive for the next file, so return
* null
*/
- free(th);
+ pg_free(th);
return NULL;
}
}
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index d56dcc701c..cb1bc9a1b6 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2787,7 +2787,7 @@ dumpTableData_insert(Archive *fout, const void *dcontext)
destroyPQExpBuffer(q);
if (insertStmt != NULL)
destroyPQExpBuffer(insertStmt);
- free(attgenerated);
+ pg_free(attgenerated);
/* Revert back the setting */
if (tbinfo->relkind == RELKIND_FOREIGN_TABLE)
@@ -3766,7 +3766,7 @@ dumpDatabase(Archive *fout)
PQclear(res);
- free(qdatname);
+ pg_free(qdatname);
destroyPQExpBuffer(dbQry);
destroyPQExpBuffer(delQry);
destroyPQExpBuffer(creaQry);
@@ -4501,11 +4501,11 @@ dumpPolicy(Archive *fout, const PolicyInfo *polinfo)
tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
polinfo->dobj.catId, 0, polinfo->dobj.dumpId);
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
destroyPQExpBuffer(delqry);
destroyPQExpBuffer(polprefix);
- free(qtabname);
+ pg_free(qtabname);
}
/*
@@ -4793,7 +4793,7 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo)
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qpubname);
+ pg_free(qpubname);
}
/*
@@ -5046,7 +5046,7 @@ dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo)
/* These objects can't currently have comments or seclabels */
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
}
@@ -5108,7 +5108,7 @@ dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo)
/* These objects can't currently have comments or seclabels */
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
}
@@ -5551,7 +5551,7 @@ dumpSubscriptionTable(Archive *fout, const SubRelInfo *subrinfo)
/* These objects can't currently have comments or seclabels */
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
}
@@ -5717,7 +5717,7 @@ dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo)
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qsubname);
+ pg_free(qsubname);
}
/*
@@ -10219,7 +10219,7 @@ determineNotNullFlags(Archive *fout, PGresult *res, int r,
tbinfo->notnull_constrs[j] =
pstrdup(PQgetvalue(res, r, i_notnull_name));
}
- free(default_name);
+ pfree(default_name);
}
}
}
@@ -12079,7 +12079,7 @@ dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo)
qnspname, NULL, NULL,
NULL, nspinfo->rolname, &nspinfo->dacl);
- free(qnspname);
+ pg_free(qnspname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -12202,7 +12202,7 @@ dumpExtension(Archive *fout, const ExtensionInfo *extinfo)
NULL, "",
extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
- free(qextname);
+ pg_free(qextname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -12375,8 +12375,8 @@ dumpEnumType(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -12528,8 +12528,8 @@ dumpRangeType(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -12597,8 +12597,8 @@ dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -12846,8 +12846,8 @@ dumpBaseType(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -12961,7 +12961,7 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo)
else
appendPQExpBuffer(q, " CONSTRAINT %s %s",
fmtId(notnull->dobj.name), notnull->condef);
- free(default_name);
+ pfree(default_name);
}
}
}
@@ -13070,8 +13070,8 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -13272,8 +13272,8 @@ dumpCompositeType(Archive *fout, const TypeInfo *tyinfo)
destroyPQExpBuffer(dropped);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qtypname);
- free(qualtypname);
+ pg_free(qtypname);
+ pg_free(qualtypname);
}
/*
@@ -13539,7 +13539,7 @@ dumpProcLang(Archive *fout, const ProcLangInfo *plang)
qlanname, NULL, NULL,
NULL, plang->lanowner, &plang->dacl);
- free(qlanname);
+ pg_free(qlanname);
destroyPQExpBuffer(defqry);
destroyPQExpBuffer(delqry);
@@ -13850,7 +13850,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
getFormattedTypeName(fout, typeids[i], zeroAsNone));
}
- free(typeids);
+ pg_free(typeids);
}
if (prokind[0] == PROKIND_WINDOW)
@@ -14018,7 +14018,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
free(funcsig);
free(funcfullsig);
free(funcsig_tag);
- free(qual_funcsig);
+ pfree(qual_funcsig);
free(configitems);
}
@@ -14604,7 +14604,7 @@ dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
aminfo->amtype, qamname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qamname);
+ pg_free(qamname);
return;
}
@@ -14633,7 +14633,7 @@ dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qamname);
+ pg_free(qamname);
}
/*
@@ -14905,9 +14905,9 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo)
opcinfo->dobj.namespace->dobj.name, opcinfo->rolname,
opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
- free(opcintype);
- free(opcfamily);
- free(amname);
+ pg_free(opcintype);
+ pg_free(opcfamily);
+ pg_free(amname);
destroyPQExpBuffer(query);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -15127,7 +15127,7 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo)
opfinfo->dobj.namespace->dobj.name, opfinfo->rolname,
opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
- free(amname);
+ pg_free(amname);
PQclear(res_ops);
PQclear(res_procs);
destroyPQExpBuffer(query);
@@ -15390,7 +15390,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
destroyPQExpBuffer(query);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qcollname);
+ pg_free(qcollname);
}
/*
@@ -15484,7 +15484,7 @@ dumpConversion(Archive *fout, const ConvInfo *convinfo)
destroyPQExpBuffer(query);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qconvname);
+ pg_free(qconvname);
}
/*
@@ -15942,7 +15942,7 @@ dumpTSParser(Archive *fout, const TSParserInfo *prsinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qprsname);
+ pg_free(qprsname);
}
/*
@@ -16022,7 +16022,7 @@ dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qdictname);
+ pg_free(qdictname);
}
/*
@@ -16080,7 +16080,7 @@ dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qtmplname);
+ pg_free(qtmplname);
}
/*
@@ -16200,7 +16200,7 @@ dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qcfgname);
+ pg_free(qcfgname);
}
/*
@@ -16270,7 +16270,7 @@ dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo)
"FOREIGN DATA WRAPPER", qfdwname, NULL, NULL,
NULL, fdwinfo->rolname, &fdwinfo->dacl);
- free(qfdwname);
+ pg_free(qfdwname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -16366,7 +16366,7 @@ dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo)
PQclear(res);
- free(qsrvname);
+ pg_free(qsrvname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -17158,13 +17158,13 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
"TABLE", namecopy, attnamecopy,
tbinfo->dobj.namespace->dobj.name,
NULL, tbinfo->rolname, &coldacl);
- free(attnamecopy);
+ pg_free(attnamecopy);
}
PQclear(res);
destroyPQExpBuffer(query);
}
- free(namecopy);
+ pg_free(namecopy);
}
/*
@@ -18154,9 +18154,9 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
tbinfo->attfdwoptions[j]);
} /* end loop over columns */
- free(partkeydef);
- free(ftoptions);
- free(srvname);
+ pg_free(partkeydef);
+ pg_free(ftoptions);
+ pg_free(srvname);
}
/*
@@ -18300,8 +18300,8 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(extra);
- free(qrelname);
- free(qualrelname);
+ pg_free(qrelname);
+ pg_free(qualrelname);
}
/*
@@ -18435,10 +18435,10 @@ dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo)
.createStmt = q->data,
.dropStmt = delq->data));
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qualrelname);
+ pg_free(qualrelname);
}
/*
@@ -18620,8 +18620,8 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
- free(qindxname);
- free(qqindxname);
+ pg_free(qindxname);
+ pg_free(qqindxname);
}
/*
@@ -18741,7 +18741,7 @@ dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo)
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
- free(qstatsextname);
+ pg_free(qstatsextname);
}
/*
@@ -19322,7 +19322,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
tyinfo->rolname,
coninfo->dobj.catId, 0, coninfo->dobj.dumpId);
destroyPQExpBuffer(conprefix);
- free(qtypname);
+ pg_free(qtypname);
}
}
}
@@ -19337,7 +19337,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
dumpTableConstraintComment(fout, coninfo);
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
}
@@ -19369,7 +19369,7 @@ dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo)
coninfo->separate ? coninfo->dobj.dumpId : tbinfo->dobj.dumpId);
destroyPQExpBuffer(conprefix);
- free(qtabname);
+ pg_free(qtabname);
}
static inline SeqType
@@ -19712,7 +19712,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
pg_free(seq);
destroyPQExpBuffer(query);
destroyPQExpBuffer(delqry);
- free(qseqname);
+ pg_free(qseqname);
}
/*
@@ -19922,12 +19922,12 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo)
tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
destroyPQExpBuffer(delqry);
destroyPQExpBuffer(trigprefix);
destroyPQExpBuffer(trigidentity);
- free(qtabname);
+ pg_free(qtabname);
}
/*
@@ -20017,7 +20017,7 @@ dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo)
destroyPQExpBuffer(query);
destroyPQExpBuffer(delqry);
- free(qevtname);
+ pg_free(qevtname);
}
/*
@@ -20173,12 +20173,12 @@ dumpRule(Archive *fout, const RuleInfo *rinfo)
tbinfo->rolname,
rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
- free(tag);
+ pfree(tag);
destroyPQExpBuffer(query);
destroyPQExpBuffer(cmd);
destroyPQExpBuffer(delcmd);
destroyPQExpBuffer(ruleprefix);
- free(qtabname);
+ pg_free(qtabname);
}
/*
@@ -20821,7 +20821,7 @@ BuildArchiveDependencies(Archive *fout)
te->nDeps = nDeps;
}
else
- free(dependencies);
+ pg_free(dependencies);
}
}
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index 03e5c1c111..5b3ea0f2a1 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -578,7 +578,7 @@ sortDumpableObjects(DumpableObject **objs, int numObjs,
memcpy(objs, ordering, numObjs * sizeof(DumpableObject *));
- free(ordering);
+ pg_free(ordering);
}
/*
@@ -734,8 +734,8 @@ TopoSort(DumpableObject **objs,
/* Done */
binaryheap_free(pendingHeap);
- free(beforeConstraints);
- free(idMap);
+ pg_free(beforeConstraints);
+ pg_free(idMap);
return (i == 0);
}
@@ -830,9 +830,9 @@ findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
if (!fixedloop)
pg_fatal("could not identify dependency loop");
- free(workspace);
- free(searchFailed);
- free(processed);
+ pg_free(workspace);
+ pg_free(searchFailed);
+ pg_free(processed);
}
/*
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index c1f43113c5..1ad38fbb82 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -1594,7 +1594,7 @@ dumpRoleGUCPrivs(PGconn *conn)
.section = SECTION_PRE_DATA,
.createStmt = buf->data));
- free(fparname);
+ pg_free(fparname);
destroyPQExpBuffer(buf);
}
@@ -1799,7 +1799,7 @@ dumpTablespaces(PGconn *conn)
.createStmt = seclabel_buf->data));
}
- free(fspcname);
+ pg_free(fspcname);
destroyPQExpBuffer(buf);
}
@@ -1865,7 +1865,7 @@ dropDBs(PGconn *conn)
.description = "DROP_GLOBAL",
.section = SECTION_PRE_DATA,
.createStmt = stmt));
- pg_free(stmt);
+ pfree(stmt);
}
}
}
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
index f5c93e611d..49ada20363 100644
--- a/src/bin/pg_upgrade/check.c
+++ b/src/bin/pg_upgrade/check.c
@@ -1034,7 +1034,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
/* Unlink file in case it is left over from a previous run. */
unlink(*deletion_script_file_name);
- pg_free(*deletion_script_file_name);
+ pfree(*deletion_script_file_name);
*deletion_script_file_name = NULL;
return;
}
@@ -1058,7 +1058,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
/* Unlink file in case it is left over from a previous run. */
unlink(*deletion_script_file_name);
- pg_free(*deletion_script_file_name);
+ pfree(*deletion_script_file_name);
*deletion_script_file_name = NULL;
return;
}
@@ -1086,7 +1086,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
fix_path_separator(old_cluster.tablespaces[tblnum]),
old_tblspc_suffix, PATH_QUOTE);
- pfree(old_tblspc_suffix);
+ pg_free(old_tblspc_suffix);
fclose(script);
@@ -1639,7 +1639,7 @@ check_for_incompatible_polymorphics(ClusterInfo *cluster)
check_ok();
termPQExpBuffer(&old_polymorphics);
- pg_free(query);
+ pfree(query);
}
/*
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
index bc7e8006d8..ebc78a634d 100644
--- a/src/bin/pg_upgrade/function.c
+++ b/src/bin/pg_upgrade/function.c
@@ -154,7 +154,7 @@ get_loadable_libraries(void)
}
pg_free(state.ress);
- pg_free(query);
+ pfree(query);
os_info.num_libraries = totaltups;
}
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c
index bd4fe635c6..f338fa22ca 100644
--- a/src/bin/pg_verifybackup/pg_verifybackup.c
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -509,7 +509,7 @@ parse_manifest_file(char *manifest_path)
}
/* Done with the buffer. */
- pfree(buffer);
+ pg_free(buffer);
return result;
}
@@ -1109,7 +1109,7 @@ verify_backup_checksums(verifier_context *context)
}
}
- pfree(buffer);
+ pg_free(buffer);
progress_report(true);
}
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 0b2bb9340b..8ab35a8c83 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3162,7 +3162,7 @@ sendCommand(CState *st, Command *command)
pg_log_debug("client %d sending %s", st->id, sql);
r = PQsendQuery(st->con, sql);
- free(sql);
+ pg_free(sql);
}
else if (querymode == QUERY_EXTENDED)
{
@@ -3355,7 +3355,7 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
}
if (*varprefix != '\0')
- pg_free(varname);
+ pfree(varname);
}
}
/* otherwise the result is simply thrown away by PQclear below */
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 01b8f11aad..5dde9bdd0e 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -2601,7 +2601,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
PQclear(res);
}
- free(user);
+ pg_free(user);
free(pw1);
free(pw2);
termPQExpBuffer(&buf);
@@ -2913,7 +2913,7 @@ exec_command_set(PsqlScanState scan_state, bool active_branch)
if (!SetVariable(pset.vars, opt0, newval))
success = false;
- free(newval);
+ pg_free(newval);
}
free(opt0);
}
@@ -3881,7 +3881,7 @@ prompt_for_password(const char *username, bool *canceled)
prompt_text = psprintf(_("Password for user %s: "), username);
result = simple_prompt_extended(prompt_text, false, &prompt_ctx);
- free(prompt_text);
+ pfree(prompt_text);
}
if (canceled)
@@ -4706,7 +4706,7 @@ editFile(const char *fname, int lineno)
pg_log_error("could not start editor \"%s\"", editorName);
else if (result == 127)
pg_log_error("could not start /bin/sh");
- free(sys);
+ pfree(sys);
return result == 0;
}
@@ -5893,7 +5893,7 @@ do_shell(const char *command)
sys = psprintf("\"%s\"", shellName);
#endif
result = system(sys);
- free(sys);
+ pfree(sys);
}
else
result = system(command);
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 1a4e2ea0da..01dfa44614 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -840,12 +840,12 @@ StoreQueryTuple(const PGresult *result)
if (!SetVariable(pset.vars, varname, value))
{
- free(varname);
+ pfree(varname);
success = false;
break;
}
- free(varname);
+ pfree(varname);
}
}
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index e1449654f9..f1ae3f4e81 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -1926,8 +1926,8 @@ describeOneTableDetails(const char *schemaname,
printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
- free(footers[0]);
- free(footers[1]);
+ pg_free(footers[0]);
+ pg_free(footers[1]);
retval = true;
goto error_return; /* not an error, just return early */
@@ -2000,8 +2000,8 @@ describeOneTableDetails(const char *schemaname,
printQuery(res, &popt, pset.queryFout, false, pset.logfile);
- free(footers[0]);
- free(footers[1]);
+ pg_free(footers[0]);
+ pg_free(footers[1]);
retval = true;
goto error_return; /* not an error, just return early */
@@ -3855,7 +3855,7 @@ describeOneTableDetails(const char *schemaname,
termPQExpBuffer(&title);
termPQExpBuffer(&tmpbuf);
- free(view_def);
+ pg_free(view_def);
PQclear(res);
@@ -4063,8 +4063,8 @@ describeRoles(const char *pattern, bool verbose, bool showSystem)
printTableCleanup(&cont);
for (i = 0; i < nrows; i++)
- free(attr[i]);
- free(attr);
+ pg_free(attr[i]);
+ pg_free(attr);
PQclear(res);
return true;
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 5e0d8f3aae..bfd3fea177 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -725,7 +725,7 @@ helpSQL(const char *topic, unsigned short int pager)
_(QL_HELP[i].help),
buffer.data,
url);
- free(url);
+ pfree(url);
termPQExpBuffer(&buffer);
/* If we have an exact match, exit. Fixes \h SELECT */
diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c
index 9f9c1cbbf5..6d37359fc9 100644
--- a/src/bin/psql/input.c
+++ b/src/bin/psql/input.c
@@ -157,7 +157,7 @@ pg_send_history(PQExpBuffer history_buf)
else
{
/* Save each previous line for ignoredups processing */
- free(prev_hist);
+ pg_free(prev_hist);
prev_hist = pg_strdup(s);
/* And send it to readline */
add_history(s);
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
index c961300fe9..25153d296b 100644
--- a/src/bin/psql/large_obj.c
+++ b/src/bin/psql/large_obj.c
@@ -210,12 +210,12 @@ do_lo_import(const char *filename_arg, const char *comment_arg)
if (!(res = PSQLexec(cmdbuf)))
{
- free(cmdbuf);
+ pg_free(cmdbuf);
return fail_lo_xact("\\lo_import", own_transaction);
}
PQclear(res);
- free(cmdbuf);
+ pg_free(cmdbuf);
}
if (!finish_lo_xact("\\lo_import", own_transaction))
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
index e9abda0716..1f409a573b 100644
--- a/src/bin/psql/mainloop.c
+++ b/src/bin/psql/mainloop.c
@@ -210,7 +210,7 @@ MainLoop(FILE *source)
if (pset.lineno == 1 && !pset.cur_cmd_interactive &&
strncmp(line, "PGDMP", 5) == 0)
{
- free(line);
+ pg_free(line);
puts(_("The input is a PostgreSQL custom-format dump.\n"
"Use the pg_restore command-line client to restore this dump to a database.\n"));
fflush(stdout);
@@ -221,7 +221,7 @@ MainLoop(FILE *source)
/* no further processing of empty lines, unless within a literal */
if (line[0] == '\0' && !psql_scan_in_quote(scan_state))
{
- free(line);
+ pg_free(line);
continue;
}
@@ -304,7 +304,7 @@ MainLoop(FILE *source)
" \\? for help with psql commands\n"
" \\g or terminate with semicolon to execute query\n"
" \\q to quit\n"));
- free(line);
+ pg_free(line);
fflush(stdout);
continue;
}
@@ -334,7 +334,7 @@ MainLoop(FILE *source)
else
{
/* exit app */
- free(line);
+ pg_free(line);
fflush(stdout);
successResult = EXIT_SUCCESS;
break;
@@ -536,7 +536,7 @@ MainLoop(FILE *source)
appendPQExpBufferChar(query_buf, '\n');
/* rescan query_buf as new input */
psql_scan_finish(scan_state);
- free(line);
+ pg_free(line);
line = pg_strdup(query_buf->data);
resetPQExpBuffer(query_buf);
/* reset parsing state since we are rescanning whole line */
@@ -574,7 +574,7 @@ MainLoop(FILE *source)
}
psql_scan_finish(scan_state);
- free(line);
+ pg_free(line);
if (slashCmdStatus == PSQL_CMD_TERMINATE)
{
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index 9725d53dfe..4906f320e7 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -333,7 +333,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
/* strip trailing newline and carriage return */
(void) pg_strip_crlf(buf);
- free(file);
+ pfree(file);
p += cmdend + 1;
break;
}
@@ -348,7 +348,7 @@ get_prompt(promptStatus_t status, ConditionalStack cstack)
val = GetVariable(pset.vars, name);
if (val)
strlcpy(buf, val, sizeof(buf));
- free(name);
+ pfree(name);
p += nameend + 1;
break;
}
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 7665f0a312..eafc7c9734 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -276,8 +276,8 @@ main(int argc, char *argv[])
new_pass = false;
pset.db = PQconnectdbParams(keywords, values, true);
- free(keywords);
- free(values);
+ pg_free(keywords);
+ pg_free(values);
if (PQstatus(pset.db) == CONNECTION_BAD &&
PQconnectionNeedsPassword(pset.db) &&
@@ -300,7 +300,7 @@ main(int argc, char *argv[])
PQfinish(pset.db);
password = simple_prompt(password_prompt, false);
- free(password_prompt);
+ pfree(password_prompt);
new_pass = true;
}
} while (new_pass);
@@ -620,7 +620,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
if (!result)
pg_fatal("could not set printing parameter \"%s\"", value);
- free(value);
+ pg_free(value);
break;
}
case 'q':
@@ -664,7 +664,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
exit(EXIT_FAILURE); /* error already printed */
}
- free(value);
+ pg_free(value);
break;
}
case 'V':
@@ -834,8 +834,8 @@ process_psqlrc_file(char *filename)
else if (access(filename, R_OK) == 0)
(void) process_file(filename, false);
- free(psqlrc_minor);
- free(psqlrc_major);
+ pfree(psqlrc_minor);
+ pfree(psqlrc_major);
}
diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c
index ad75622711..3e90253ab7 100644
--- a/src/bin/psql/stringutils.c
+++ b/src/bin/psql/stringutils.c
@@ -70,7 +70,7 @@ strtokx(const char *s,
if (s)
{
- free(storage);
+ pg_free(storage);
/*
* We may need extra space to insert delimiter nulls for adjacent
@@ -93,7 +93,7 @@ strtokx(const char *s,
if (*start == '\0')
{
/* technically we don't need to free here, but we're nice */
- free(storage);
+ pg_free(storage);
storage = NULL;
string = NULL;
return NULL;
@@ -334,7 +334,7 @@ quote_if_needed(const char *source, const char *entails_quote,
if (!need_quotes)
{
- free(ret);
+ pg_free(ret);
ret = NULL;
}
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index de547a8cb3..84308836bb 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -2139,12 +2139,12 @@ psql_completion(const char *text, int start, int end)
}
/* free storage */
- free(previous_words);
+ pg_free(previous_words);
free(words_buffer);
- free(text_copy);
- free(completion_ref_object);
+ pfree(text_copy);
+ pg_free(completion_ref_object);
completion_ref_object = NULL;
- free(completion_ref_schema);
+ pg_free(completion_ref_schema);
completion_ref_schema = NULL;
/* Return our Grand List O' Matches */
@@ -6250,7 +6250,7 @@ _complete_from_query(const char *simple_query,
/* Clean up */
termPQExpBuffer(&query_buffer);
free(schemaname);
- free(objectname);
+ pg_free(objectname);
free(e_object_like);
free(e_schemaname);
free(e_ref_object);
@@ -6550,7 +6550,7 @@ complete_from_variables(const char *text, const char *prefix, const char *suffix
for (i = 0; i < nvars; i++)
free(varnames[i]);
- free(varnames);
+ pg_free(varnames);
return matches;
}
@@ -6806,7 +6806,7 @@ make_like_pattern(const char *word)
*bptr = '\0';
result = escape_string(buffer);
- free(buffer);
+ pg_free(buffer);
return result;
}
@@ -7192,7 +7192,7 @@ get_previous_words(int point, char **buffer, int *nwords)
/* Release parsing input workspace, if we made one above */
if (buf != rl_line_buffer)
- free(buf);
+ pg_free(buf);
*nwords = words_found;
return previous_words;
@@ -7319,7 +7319,7 @@ dequote_file_name(char *fname, int quote_char)
strcpy(workspace + 1, fname);
unquoted_fname = strtokx(workspace, "", NULL, "'", *completion_charp,
false, true, pset.encoding);
- free(workspace);
+ pg_free(workspace);
}
else
unquoted_fname = strtokx(fname, "", NULL, "'", *completion_charp,
diff --git a/src/bin/scripts/vacuuming.c b/src/bin/scripts/vacuuming.c
index faac9089a0..33407ad59f 100644
--- a/src/bin/scripts/vacuuming.c
+++ b/src/bin/scripts/vacuuming.c
@@ -490,7 +490,7 @@ vacuum_all_databases(ConnParams *cparams,
{
for (int i = 0; i < numdbs; i++)
free_retrieved_objects(found_objs[i]);
- pg_free(found_objs);
+ pfree(found_objs);
}
}
else
diff --git a/src/common/logging.c b/src/common/logging.c
index 648f2c1d6f..8561e292be 100644
--- a/src/common/logging.c
+++ b/src/common/logging.c
@@ -360,5 +360,5 @@ pg_log_generic_v(enum pg_log_level level, enum pg_log_part part,
fflush(log_logfile);
}
- free(buf);
+ pg_free(buf);
}
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index f2dd52003c..fc27735d46 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -1180,21 +1180,21 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
/* clean up */
for (i = 0; i < col_count; i++)
{
- free(col_lineptrs[i]);
- free(format_buf[i]);
+ pg_free(col_lineptrs[i]);
+ pg_free(format_buf[i]);
}
- free(width_header);
- free(width_average);
- free(max_width);
- free(width_wrap);
- free(max_nl_lines);
- free(curr_nl_line);
- free(col_lineptrs);
- free(max_bytes);
- free(format_buf);
- free(header_done);
- free(bytes_output);
- free(wrap);
+ pg_free(width_header);
+ pg_free(width_average);
+ pg_free(max_width);
+ pg_free(width_wrap);
+ pg_free(max_nl_lines);
+ pg_free(curr_nl_line);
+ pg_free(col_lineptrs);
+ pg_free(max_bytes);
+ pg_free(format_buf);
+ pg_free(header_done);
+ pg_free(bytes_output);
+ pg_free(wrap);
if (is_local_pager)
ClosePager(fout);
@@ -1808,8 +1808,8 @@ print_aligned_vertical(const printTableContent *cont,
free(hlineptr->ptr);
free(dlineptr->ptr);
- free(hlineptr);
- free(dlineptr);
+ pg_free(hlineptr);
+ pg_free(dlineptr);
if (is_local_pager)
ClosePager(fout);
@@ -3618,7 +3618,7 @@ count_table_lines(const printTableContent *cont,
}
}
- free(header_height);
+ pg_free(header_height);
return lines;
}
diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c
index ad66e4d65c..ffac915d19 100644
--- a/src/interfaces/ecpg/test/pg_regress_ecpg.c
+++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c
@@ -217,7 +217,7 @@ ecpg_start_test(const char *testname,
appnameenv = psprintf("ecpg/%s", testname_dash.data);
setenv("PGAPPNAME", appnameenv, 1);
- free(appnameenv);
+ pfree(appnameenv);
pid = spawn_process(cmd);
diff --git a/src/test/isolation/isolation_main.c b/src/test/isolation/isolation_main.c
index 423b018afb..56a758c76b 100644
--- a/src/test/isolation/isolation_main.c
+++ b/src/test/isolation/isolation_main.c
@@ -89,7 +89,7 @@ isolation_start_test(const char *testname,
appnameenv = psprintf("isolation/%s", testname);
setenv("PGAPPNAME", appnameenv, 1);
- free(appnameenv);
+ pfree(appnameenv);
pid = spawn_process(psql_cmd.data);
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index 440c875b8a..e64dc020b1 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -383,7 +383,7 @@ check_testspec(TestSpec *testspec)
}
}
- free(allsteps);
+ pg_free(allsteps);
}
/*
@@ -437,9 +437,9 @@ run_all_permutations(TestSpec *testspec)
run_all_permutations_recurse(testspec, piles, 0, stepptrs);
- free(steps);
- free(stepptrs);
- free(piles);
+ pg_free(steps);
+ pg_free(stepptrs);
+ pg_free(piles);
}
static void
@@ -742,7 +742,7 @@ run_permutation(TestSpec *testspec, int nsteps, PermutationStep **steps)
PQclear(res);
}
- free(waiting);
+ pg_free(waiting);
}
/*
diff --git a/src/test/modules/libpq_pipeline/libpq_pipeline.c b/src/test/modules/libpq_pipeline/libpq_pipeline.c
index ee3e2ec757..1660a68955 100644
--- a/src/test/modules/libpq_pipeline/libpq_pipeline.c
+++ b/src/test/modules/libpq_pipeline/libpq_pipeline.c
@@ -281,8 +281,8 @@ copy_connection(PGconn *conn)
pg_fatal("Connection to database failed: %s",
PQerrorMessage(copyConn));
- pfree(keywords);
- pfree(vals);
+ pg_free(keywords);
+ pg_free(vals);
PQconninfoFree(opts);
return copyConn;
@@ -1438,8 +1438,8 @@ test_protocol_version(PGconn *conn)
PQfinish(conn);
- pfree(keywords);
- pfree(vals);
+ pg_free(keywords);
+ pg_free(vals);
PQconninfoFree(opts);
}
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 1c052cc0fb..5596d632fd 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -811,7 +811,7 @@ initialize_environment(void)
new_pgoptions = psprintf("%s %s",
old_pgoptions, my_pgoptions);
setenv("PGOPTIONS", new_pgoptions, 1);
- free(new_pgoptions);
+ pfree(new_pgoptions);
}
if (temp_instance)
@@ -997,7 +997,7 @@ current_windows_user(const char **acct, const char **dom)
GetLastError());
}
- free(tokenuser);
+ pg_free(tokenuser);
*acct = accountname;
*dom = domainname;
@@ -1680,7 +1680,7 @@ wait_for_tests(PID_TYPE * pids, int *statuses, instr_time *stoptimes,
}
#ifdef WIN32
- free(active_pids);
+ pg_free(active_pids);
#endif
}
diff --git a/src/test/regress/pg_regress_main.c b/src/test/regress/pg_regress_main.c
index 701f3dd5d9..169646e351 100644
--- a/src/test/regress/pg_regress_main.c
+++ b/src/test/regress/pg_regress_main.c
@@ -82,7 +82,7 @@ psql_start_test(const char *testname,
appnameenv = psprintf("pg_regress/%s", testname);
setenv("PGAPPNAME", appnameenv, 1);
- free(appnameenv);
+ pfree(appnameenv);
pid = spawn_process(psql_cmd.data);
--
Tristan Partin
https://tristan.partin.io
// Skip pointers that are also assigned from libc allocators (e.g. #ifdef
FRONTEND)
@ palloc_skip exists @
type T;
T *ptr;
identifier libc_alloc =~ "^(malloc|calloc|realloc|strdup)$";
identifier dealloc =~ "^(free|pg_free)$";
position p;
@@
ptr = libc_alloc(...);
...
dealloc@p(ptr);
// palloc-family allocated memory must be freed with pfree, not free/pg_free.
// Handles: ptr = palloc(...);
@ exists @
type T;
T *ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// palloc-family with chained assignment: x = ptr = palloc(...);
@ exists @
type T;
T *ptr;
expression E;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
E = ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// palloc-family with typedef'd pointer: T ptr = palloc(...);
@ exists @
type T;
T ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// palloc-family with cast: ptr = (C *) palloc(...);
@ exists @
type T, C;
T *ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// palloc-family with declaration: T *ptr = palloc(...);
@ exists @
type T;
identifier ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
T *ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// palloc-family with declaration and cast: T *ptr = (C *) palloc(...);
@ exists @
type T, C;
identifier ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
T *ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pfree(ptr);
// Skip pointers that are also assigned from libc allocators for pg_malloc rules
@ pgmalloc_skip exists @
type T;
T *ptr;
identifier libc_alloc =~ "^(malloc|calloc|realloc|strdup)$";
identifier dealloc =~ "^(free|pfree)$";
position p;
@@
ptr = libc_alloc(...);
...
dealloc@p(ptr);
// pg_malloc-family allocated memory must be freed with pg_free, not free/pfree.
// Handles: ptr = pg_malloc(...);
@ exists @
type T;
T *ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family with chained assignment: x = ptr = pg_malloc(...);
@ exists @
type T;
T *ptr;
expression E;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
E = ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family with typedef'd pointer: T ptr = pg_malloc(...);
@ exists @
type T;
T ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family with cast: ptr = (C *) pg_malloc(...);
@ exists @
type T, C;
T *ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family with declaration: T *ptr = pg_malloc(...);
@ exists @
type T;
identifier ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
T *ptr = alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family with declaration and cast: T *ptr = (C *) pg_malloc(...);
@ exists @
type T, C;
identifier ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
T *ptr = (C *) alloc(...);
... when any
- dealloc@p(ptr);
+ pg_free(ptr);
// pg_malloc-family: free before re-allocation of same pointer
@ exists @
type T;
T *ptr;
identifier alloc =~
"^pg_(strdup|nstrdup|malloc|malloc0|malloc_array|malloc0_array|malloc_object|malloc0_object|malloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pfree)$";
position p != pgmalloc_skip.p;
@@
- dealloc@p(ptr);
+ pg_free(ptr);
... when any
ptr = alloc(...);
// palloc-family: free before re-allocation of same pointer
@ exists @
type T;
T *ptr;
identifier alloc =~ "^p(strdup|nstrdup|alloc|alloc0|alloc_extended|sprintf)$";
identifier dealloc =~ "^(free|pg_free)$";
position p != palloc_skip.p;
@@
- dealloc@p(ptr);
+ pfree(ptr);
... when any
ptr = alloc(...);