libpq: Add pqReleaseConnHosts function
authorAlvaro Herrera
Sun, 4 Feb 2024 15:19:20 +0000 (16:19 +0100)
committerAlvaro Herrera
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 
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);