libpq: Add pqReleaseConnHosts function
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Sun, 4 Feb 2024 15:19:20 +0000 (16:19 +0100)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Sun, 4 Feb 2024 15:19:20 +0000 (16:19 +0100)
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

src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-int.h

index c0dea144a00e192733c5168e0b00d5ceefd8792a..5add6f4ebb3b1ed0cb795f08287848a470005751 100644 (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
index ff8e0dce776dba681b5b02d8b8e19c6bdf72d4cc..5ac50fe20cb52d9c259379af2012236305349f06 100644 (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);