aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2019-03-24 15:13:21 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2019-03-24 15:13:21 -0400
commitb7ffa0ee8d55af0eb236d7496853c38c266d96d5 (patch)
treed0c7b7e293cd4b19ef7eb2c2829962f14b10b0c8
parent89f39736f4845e81f350893dd59fd52cedab8b39 (diff)
downloadpostgresql-b7ffa0ee8d55af0eb236d7496853c38c266d96d5.tar.gz
postgresql-b7ffa0ee8d55af0eb236d7496853c38c266d96d5.zip
Avoid double-free in vacuumlo error path.
The code would do "PQclear(res)" twice if lo_unlink failed, evidently due to careless thinking about how far out a "break" would break. Remove the extra PQclear and adjust the loop logic so that we'll fall out of both levels of loop after an error, as was clearly the intent. Spotted by Coverity. I have no idea why it took this long to notice, since the bug has been there since commit 67ccbb080. Accordingly, back-patch to all supported branches.
-rw-r--r--contrib/vacuumlo/vacuumlo.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 7eb474ca3e4..8dbcaad797a 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -316,7 +316,7 @@ vacuumlo(const char *database, const struct _param *param)
deleted = 0;
- while (1)
+ do
{
res = PQexec(conn, buf);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@@ -354,8 +354,7 @@ vacuumlo(const char *database, const struct _param *param)
if (PQtransactionStatus(conn) == PQTRANS_INERROR)
{
success = false;
- PQclear(res);
- break;
+ break; /* out of inner for-loop */
}
}
else
@@ -393,7 +392,7 @@ vacuumlo(const char *database, const struct _param *param)
}
PQclear(res);
- }
+ } while (success);
/*
* That's all folks!