1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-03 22:24:49 +03:00

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.
This commit is contained in:
Tom Lane 2009-12-30 03:46:08 +00:00
parent 31c88772c8
commit 2de646cd8f
2 changed files with 6 additions and 2 deletions

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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) * Since the server static private key ($DataDir/server.key)
* will normally be stored unencrypted so that the database * will normally be stored unencrypted so that the database
@ -263,6 +263,7 @@ secure_read(Port *port, void *ptr, size_t len)
int err; int err;
rloop: rloop:
errno = 0;
n = SSL_read(port->ssl, ptr, len); n = SSL_read(port->ssl, ptr, len);
err = SSL_get_error(port->ssl, n); err = SSL_get_error(port->ssl, n);
switch (err) switch (err)
@ -357,6 +358,7 @@ secure_write(Port *port, void *ptr, size_t len)
} }
wloop: wloop:
errno = 0;
n = SSL_write(port->ssl, ptr, len); n = SSL_write(port->ssl, ptr, len);
err = SSL_get_error(port->ssl, n); err = SSL_get_error(port->ssl, n);
switch (err) switch (err)

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* [ Most of these notes are wrong/obsolete, but perhaps not all ] * [ 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; int err;
rloop: rloop:
SOCK_ERRNO_SET(0);
n = SSL_read(conn->ssl, ptr, len); n = SSL_read(conn->ssl, ptr, len);
err = SSL_get_error(conn->ssl, n); err = SSL_get_error(conn->ssl, n);
switch (err) switch (err)
@ -347,6 +348,7 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len)
{ {
int err; int err;
SOCK_ERRNO_SET(0);
n = SSL_write(conn->ssl, ptr, len); n = SSL_write(conn->ssl, ptr, len);
err = SSL_get_error(conn->ssl, n); err = SSL_get_error(conn->ssl, n);
switch (err) switch (err)