1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-24 09:27:52 +03:00

Fix libpq memory leak during PQreset() --- closePGconn() was not

freeing all transient state of the PGconn object.
This commit is contained in:
Tom Lane
2005-07-13 15:26:06 +00:00
parent 18e64f6c81
commit 35a0fc32f5

View File

@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.301.4.3 2005/05/05 16:36:20 momjian Exp $ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.301.4.4 2005/07/13 15:26:06 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@@ -2027,6 +2027,8 @@ makeEmptyPGconn(void)
/* /*
* freePGconn * freePGconn
* - free the PGconn data structure * - free the PGconn data structure
*
* When changing/adding to this function, see also closePGconn!
*/ */
static void static void
freePGconn(PGconn *conn) freePGconn(PGconn *conn)
@@ -2070,6 +2072,7 @@ freePGconn(PGconn *conn)
if (conn->sslmode) if (conn->sslmode)
free(conn->sslmode); free(conn->sslmode);
/* Note that conn->Pfdebug is not ours to close or free */ /* Note that conn->Pfdebug is not ours to close or free */
freeaddrinfo_all(conn->addrlist_family, conn->addrlist);
notify = conn->notifyHead; notify = conn->notifyHead;
while (notify != NULL) while (notify != NULL)
{ {
@@ -2078,7 +2081,6 @@ freePGconn(PGconn *conn)
notify = notify->next; notify = notify->next;
free(prev); free(prev);
} }
freeaddrinfo_all(conn->addrlist_family, conn->addrlist);
pstatus = conn->pstatus; pstatus = conn->pstatus;
while (pstatus != NULL) while (pstatus != NULL)
{ {
@@ -2101,10 +2103,15 @@ freePGconn(PGconn *conn)
/* /*
* closePGconn * closePGconn
* - properly close a connection to the backend * - properly close a connection to the backend
*
* Release all transient state, but NOT the connection parameters.
*/ */
static void static void
closePGconn(PGconn *conn) closePGconn(PGconn *conn)
{ {
PGnotify *notify;
pgParameterStatus *pstatus;
/* /*
* Note that the protocol doesn't allow us to send Terminate messages * Note that the protocol doesn't allow us to send Terminate messages
* during the startup phase. * during the startup phase.
@@ -2140,6 +2147,27 @@ closePGconn(PGconn *conn)
* absent */ * absent */
conn->asyncStatus = PGASYNC_IDLE; conn->asyncStatus = PGASYNC_IDLE;
pqClearAsyncResult(conn); /* deallocate result and curTuple */ pqClearAsyncResult(conn); /* deallocate result and curTuple */
freeaddrinfo_all(conn->addrlist_family, conn->addrlist);
conn->addrlist = NULL;
conn->addr_cur = NULL;
notify = conn->notifyHead;
while (notify != NULL)
{
PGnotify *prev = notify;
notify = notify->next;
free(prev);
}
conn->notifyHead = NULL;
pstatus = conn->pstatus;
while (pstatus != NULL)
{
pgParameterStatus *prev = pstatus;
pstatus = pstatus->next;
free(prev);
}
conn->pstatus = NULL;
if (conn->lobjfuncs) if (conn->lobjfuncs)
free(conn->lobjfuncs); free(conn->lobjfuncs);
conn->lobjfuncs = NULL; conn->lobjfuncs = NULL;