From b9db005e37e3dce8aa05d4f09e03a1d806bd8bcd Mon Sep 17 00:00:00 2001 From: Jelte Fennema-Nio Date: Fri, 26 Jan 2024 17:01:28 +0100 Subject: [PATCH v29 2/5] libpq: Add pqReleaseConnHosts function In a follow up PR we'll need to free this connhost field in a function defined in fe-cancel.c So this extracts the logic to a dedicated extern function. --- src/interfaces/libpq/fe-connect.c | 38 ++++++++++++++++++++----------- src/interfaces/libpq/libpq-int.h | 1 + 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index c0dea144a00..079abfca9e2 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -4349,19 +4349,7 @@ freePGconn(PGconn *conn) free(conn->events[i].name); } - /* clean up pg_conn_host structures */ - for (int i = 0; i < conn->nconnhost; ++i) - { - free(conn->connhost[i].host); - free(conn->connhost[i].hostaddr); - free(conn->connhost[i].port); - if (conn->connhost[i].password != NULL) - { - explicit_bzero(conn->connhost[i].password, strlen(conn->connhost[i].password)); - free(conn->connhost[i].password); - } - } - free(conn->connhost); + pqReleaseConnHosts(conn); free(conn->client_encoding_initial); free(conn->events); @@ -4480,6 +4468,30 @@ release_conn_addrinfo(PGconn *conn) } } +/* + * pqReleaseConnHosts + * - Free the host list in the PGconn. + */ +void +pqReleaseConnHosts(PGconn *conn) +{ + if (conn->connhost) + { + for (int i = 0; i < conn->nconnhost; ++i) + { + free(conn->connhost[i].host); + free(conn->connhost[i].hostaddr); + free(conn->connhost[i].port); + if (conn->connhost[i].password != NULL) + { + explicit_bzero(conn->connhost[i].password, strlen(conn->connhost[i].password)); + free(conn->connhost[i].password); + } + } + free(conn->connhost); + } +} + /* * sendTerminateConn * - Send a terminate message to backend. diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index ff8e0dce776..0d06e260262 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -683,6 +683,7 @@ extern int pqPacketSend(PGconn *conn, char pack_type, extern bool pqGetHomeDirectory(char *buf, int bufsize); extern bool pqParseIntParam(const char *value, int *result, PGconn *conn, const char *context); +extern void pqReleaseConnHosts(PGconn *conn); extern pgthreadlock_t pg_g_threadlock; base-commit: 6a1ea02c491d16474a6214603dce40b5b122d4d1 -- 2.34.1