libpq: Add pqReleaseConnHosts function

In a follow up commit we'll need to free this connhost field in a
function defined in fe-cancel.c, so here we extract the logic to a
dedicated extern function.

Author: Jelte Fennema-Nio <jelte.fennema@microsoft.com>
Discussion: https://postgr.es/m/AM5PR83MB0178D3B31CA1B6EC4A8ECC42F7529@AM5PR83MB0178.EURPRD83.prod.outlook.com
This commit is contained in:
Alvaro Herrera 2024-02-04 16:19:20 +01:00
parent c717525035
commit 53747f7222
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
2 changed files with 27 additions and 13 deletions

View File

@ -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);
@ -4423,6 +4411,31 @@ freePGconn(PGconn *conn)
free(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);
}
}
/*
* store_conn_addrinfo
* - copy addrinfo to PGconn object

View File

@ -678,6 +678,7 @@ extern void pqDropConnection(PGconn *conn, bool flushInput);
#if defined(WIN32) && defined(SIO_KEEPALIVE_VALS)
extern int pqSetKeepalivesWin32(pgsocket sock, int idle, int interval);
#endif
extern void pqReleaseConnHosts(PGconn *conn);
extern int pqPacketSend(PGconn *conn, char pack_type,
const void *buf, size_t buf_len);
extern bool pqGetHomeDirectory(char *buf, int bufsize);