From: Timo Sirainen Date: Sat, 27 Mar 2010 02:06:20 +0000 (+0200) Subject: pgsql: Don't leak memory if query returns multiple results. X-Git-Tag: 2.0.beta5~271 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c44f402f17f9a58ead24ac0083945cae86fb172b;p=thirdparty%2Fdovecot%2Fcore.git pgsql: Don't leak memory if query returns multiple results. Found by Rainer Weikusat. --HG-- branch : HEAD --- 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);