From 09f0e46cbc8bad67c45a2b717e09ea9fec6074fd Mon Sep 17 00:00:00 2001
From: Tristan Partin <tristan@partin.io>
Date: Wed, 6 May 2026 21:58:16 +0000
Subject: [PATCH v1] 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 <tristan@partin.io>
---
 contrib/oid2name/oid2name.c                   |   6 +-
 src/bin/initdb/initdb.c                       |  14 +-
 src/bin/pg_basebackup/pg_basebackup.c         |   2 +-
 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                       |   8 +-
 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          |  18 +--
 src/bin/pg_dump/pg_backup_custom.c            |   4 +-
 src/bin/pg_dump/pg_backup_db.c                |   2 +-
 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/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                    |   4 +-
 src/bin/psql/tab-complete.in.c                |  12 +-
 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 +-
 46 files changed, 217 insertions(+), 217 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 c1a4672aa6..b02b8c2fdd 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -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 15e06e5686..469204268c 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -759,7 +759,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);
 
@@ -774,7 +774,7 @@ modify_subscriber_sysid(const struct CreateSubscriberOptions *opt)
 	}
 
 	pg_free(cf);
-	pg_free(cmd_str);
+	pfree(cmd_str);
 }
 
 /*
@@ -2129,8 +2129,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);
 }
 
@@ -2514,7 +2514,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 2e50b7af4d..0b5a4ae4d7 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 5539eb8ebe..85b878a6c2 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,7 +2168,7 @@ 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);
@@ -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 fecf6f2d1c..7e65562886 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;
 }
 
@@ -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
@@ -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 5299062094..052ad5c6a2 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..4de391f5ac 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -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 d6a1428c67..102c456283 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 a3879410c9..7d2dd007c9 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 5a7afe62ea..d0cca5bf64 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 bb4fb97219..1baccbbf4f 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 c969afab3a..06266650db 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 493400f909..10ae979893 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;
 }
@@ -5887,7 +5887,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 476e7fe673..1e937fefba 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -838,12 +838,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/large_obj.c b/src/bin/psql/large_obj.c
index 021f78e0f7..72e81403bf 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 69d044d405..23f23259c5 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);
+			pg_free(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..2140668ea0 100644
--- a/src/bin/psql/stringutils.c
+++ b/src/bin/psql/stringutils.c
@@ -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 db65d130fc..0dfe4e906c 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -2140,7 +2140,7 @@ psql_completion(const char *text, int start, int end)
 	/* free storage */
 	free(previous_words);
 	free(words_buffer);
-	free(text_copy);
+	pfree(text_copy);
 	free(completion_ref_object);
 	completion_ref_object = NULL;
 	free(completion_ref_schema);
@@ -6223,7 +6223,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);
@@ -6523,7 +6523,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;
 }
@@ -6779,7 +6779,7 @@ make_like_pattern(const char *word)
 	*bptr = '\0';
 
 	result = escape_string(buffer);
-	free(buffer);
+	pg_free(buffer);
 	return result;
 }
 
@@ -7165,7 +7165,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;
@@ -7292,7 +7292,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 4a69d96281..75d6355b93 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 aa0a6bbe76..18f2fbe8d3 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 c26efeba1e..bd2acaac6b 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

