aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/libpq/fe-secure-gssapi.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-05-05 13:10:09 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-05-05 13:10:17 -0400
commit46da7bf671c002659d48dad72d325167db8df84b (patch)
tree348318b53451931fd1ae4a0e862a4c68dfdf8c21 /src/interfaces/libpq/fe-secure-gssapi.c
parentd4329a60d5708382957e61d1036a03929f75c9fc (diff)
downloadpostgresql-46da7bf671c002659d48dad72d325167db8df84b.tar.gz
postgresql-46da7bf671c002659d48dad72d325167db8df84b.zip
Fix severe memory leaks in GSSAPI encryption support.
Both the backend and libpq leaked buffers containing encrypted data to be transmitted, so that the process size would grow roughly as the total amount of data sent. There were also far-less-critical leaks of the same sort in GSSAPI session establishment. Oversight in commit b0b39f72b, which I failed to notice while reviewing the code in 2c0cdc818. Per complaint from pmc@citylink. Back-patch to v12 where this code was introduced. Discussion: https://postgr.es/m/20200504115649.GA77072@gate.oper.dinoex.org
Diffstat (limited to 'src/interfaces/libpq/fe-secure-gssapi.c')
-rw-r--r--src/interfaces/libpq/fe-secure-gssapi.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c
index 9fd06eabd2f..1994e9f6150 100644
--- a/src/interfaces/libpq/fe-secure-gssapi.c
+++ b/src/interfaces/libpq/fe-secure-gssapi.c
@@ -232,6 +232,9 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len)
memcpy(PqGSSSendBuffer + PqGSSSendLength, output.value, output.length);
PqGSSSendLength += output.length;
+
+ /* Release buffer storage allocated by GSSAPI */
+ gss_release_buffer(&minor, &output);
}
/* If we get here, our counters should all match up. */
@@ -241,6 +244,7 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len)
ret = bytes_sent;
cleanup:
+ /* Release GSSAPI buffer storage, if we didn't already */
if (output.value != NULL)
gss_release_buffer(&minor, &output);
return ret;
@@ -408,12 +412,14 @@ pg_GSS_read(PGconn *conn, void *ptr, size_t len)
/* Our receive buffer is now empty, reset it */
PqGSSRecvLength = 0;
+ /* Release buffer storage allocated by GSSAPI */
gss_release_buffer(&minor, &output);
}
ret = bytes_returned;
cleanup:
+ /* Release GSSAPI buffer storage, if we didn't already */
if (output.value != NULL)
gss_release_buffer(&minor, &output);
return ret;
@@ -652,6 +658,7 @@ pqsecure_open_gss(PGconn *conn)
gss_release_cred(&minor, &conn->gcred);
conn->gcred = GSS_C_NO_CREDENTIAL;
conn->gssenc = true;
+ gss_release_buffer(&minor, &output);
/*
* Determine the max packet size which will fit in our buffer, after
@@ -676,6 +683,7 @@ pqsecure_open_gss(PGconn *conn)
{
pg_GSS_error(libpq_gettext("GSSAPI context establishment error"),
conn, major, minor);
+ gss_release_buffer(&minor, &output);
return PGRES_POLLING_FAILED;
}
@@ -690,6 +698,7 @@ pqsecure_open_gss(PGconn *conn)
/* We don't bother with PqGSSSendConsumed here */
+ /* Release buffer storage allocated by GSSAPI */
gss_release_buffer(&minor, &output);
/* Ask to be called again to write data */