diff --git a/src/interfaces/libpq/fe-cancel.c b/src/interfaces/libpq/fe-cancel.c index 4f00a91b51..7dd1c45093 100644 --- a/src/interfaces/libpq/fe-cancel.c +++ b/src/interfaces/libpq/fe-cancel.c @@ -145,7 +145,7 @@ PQcancelCreate(PGconn *conn) } cancelConn->addr = calloc(cancelConn->naddr, sizeof(AddrInfo)); - if (!cancelConn->connhost) + if (!cancelConn->addr) goto oom_error; cancelConn->addr[0].addr = conn->raddr; @@ -155,6 +155,8 @@ PQcancelCreate(PGconn *conn) return (PGcancelConn *) cancelConn; oom_error: + pqReleaseConnHosts(cancelConn); + conn->status = CONNECTION_BAD; libpq_append_conn_error(cancelConn, "out of memory"); return (PGcancelConn *) cancelConn; diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 548ad118fb..8b3d51e39c 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -4727,7 +4727,7 @@ pqReleaseConnHosts(PGconn *conn) { if (conn->connhost) { - for (int i = 0; i < conn->nconnhost; ++i) + for (int i = 0; i < conn->nconnhost; i++) { free(conn->connhost[i].host); free(conn->connhost[i].hostaddr); @@ -4740,7 +4740,12 @@ pqReleaseConnHosts(PGconn *conn) } } free(conn->connhost); + conn->connhost = NULL; } + free(conn->addr); + conn->addr = NULL; + conn->nconnhost = 0; + conn->naddr = 0; } /*