From c44f402f17f9a58ead24ac0083945cae86fb172b Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 27 Mar 2010 04:06:20 +0200 Subject: [PATCH] pgsql: Don't leak memory if query returns multiple results. Found by Rainer Weikusat. --HG-- branch : HEAD --- src/lib-sql/driver-pgsql.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib-sql/driver-pgsql.c b/src/lib-sql/driver-pgsql.c index 05563d075a..fdcc936de0 100644 --- a/src/lib-sql/driver-pgsql.c +++ b/src/lib-sql/driver-pgsql.c @@ -249,13 +249,17 @@ driver_pgsql_get_flags(struct sql_db *db ATTR_UNUSED) static void consume_results(struct pgsql_db *db) { - do { - if (!PQconsumeInput(db->pg)) - break; + PGresult *pgres; + while (PQconsumeInput(db->pg)) { if (PQisBusy(db->pg)) return; - } while (PQgetResult(db->pg) != NULL); + + pgres = PQgetResult(db->pg); + if (pgres == NULL) + break; + PQclear(pgres); + } if (PQstatus(db->pg) == CONNECTION_BAD) io_remove_closed(&db->io); @@ -280,6 +284,7 @@ static void driver_pgsql_result_free(struct sql_result *_result) if (result->pgres != NULL) { PQclear(result->pgres); + result->pgres = NULL; /* we'll have to read the rest of the results as well */ i_assert(db->io == NULL); -- 2.47.3