aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-12-30 03:46:08 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-12-30 03:46:08 +0000
commit2de646cd8f31318b1642c0f2cb717b32207d53e0 (patch)
tree5c6cf8cebfb3ffb4d55cc687df62d8656e2606d6 /src
parent31c88772c80cf3863ac538d96187640d41f18884 (diff)
downloadpostgresql-2de646cd8f31318b1642c0f2cb717b32207d53e0.tar.gz
postgresql-2de646cd8f31318b1642c0f2cb717b32207d53e0.zip
Set errno to zero before invoking SSL_read or SSL_write. It appears that
at least in some Windows versions, these functions are capable of returning a failure indication without setting errno. That puts us into an infinite loop if the previous value happened to be EINTR. Per report from Brendan Hill. Back-patch to 8.2. We could take it further back, but since this is only known to be an issue on Windows and we don't support Windows before 8.2, it does not seem worth the trouble.
Diffstat (limited to 'src')
-rw-r--r--src/backend/libpq/be-secure.c4
-rw-r--r--src/interfaces/libpq/fe-secure.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c
index 142b7276426..df730b658c6 100644
--- a/src/backend/libpq/be-secure.c
+++ b/src/backend/libpq/be-secure.c
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/libpq/be-secure.c,v 1.74.2.4 2009/12/09 06:37:21 mha Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/be-secure.c,v 1.74.2.5 2009/12/30 03:46:08 tgl Exp $
*
* Since the server static private key ($DataDir/server.key)
* will normally be stored unencrypted so that the database
@@ -263,6 +263,7 @@ secure_read(Port *port, void *ptr, size_t len)
int err;
rloop:
+ errno = 0;
n = SSL_read(port->ssl, ptr, len);
err = SSL_get_error(port->ssl, n);
switch (err)
@@ -357,6 +358,7 @@ secure_write(Port *port, void *ptr, size_t len)
}
wloop:
+ errno = 0;
n = SSL_write(port->ssl, ptr, len);
err = SSL_get_error(port->ssl, n);
switch (err)
diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c
index 16cf832b6f5..0cd0197a25a 100644
--- a/src/interfaces/libpq/fe-secure.c
+++ b/src/interfaces/libpq/fe-secure.c
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.89.2.2 2009/12/09 06:37:21 mha Exp $
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.89.2.3 2009/12/30 03:46:08 tgl Exp $
*
* NOTES
* [ Most of these notes are wrong/obsolete, but perhaps not all ]
@@ -256,6 +256,7 @@ pqsecure_read(PGconn *conn, void *ptr, size_t len)
int err;
rloop:
+ SOCK_ERRNO_SET(0);
n = SSL_read(conn->ssl, ptr, len);
err = SSL_get_error(conn->ssl, n);
switch (err)
@@ -347,6 +348,7 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len)
{
int err;
+ SOCK_ERRNO_SET(0);
n = SSL_write(conn->ssl, ptr, len);
err = SSL_get_error(conn->ssl, n);
switch (err)