From 4e86f1b16da85ba0a99c592dc7b977b3be80a483 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 1 Dec 2014 17:43:14 +0200 Subject: [PATCH] Put SSL_pending() call behind the new internal SSL API. It seems likely that any SSL implementation will need a similar call, not just OpenSSL. --- src/interfaces/libpq/fe-misc.c | 4 ++-- src/interfaces/libpq/fe-secure-openssl.c | 9 +++++++++ src/interfaces/libpq/libpq-int.h | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index f58d798742..de0f9efd27 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -1054,9 +1054,9 @@ pqSocketCheck(PGconn *conn, int forRead, int forWrite, time_t end_time) return -1; } -#ifdef USE_OPENSSL +#ifdef USE_SSL /* Check for SSL library buffering read bytes */ - if (forRead && conn->ssl && SSL_pending(conn->ssl) > 0) + if (forRead && conn->ssl_in_use && pgtls_read_pending(conn) > 0) { /* short-circuit the select */ return 1; diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 78aa46de2f..7fcc1f02f8 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -186,6 +186,15 @@ pgtls_open_client(PGconn *conn) return open_client_SSL(conn); } +/* + * Is there unread data waiting in the SSL read buffer? + */ +bool +pgtls_read_pending(PGconn *conn) +{ + return SSL_pending(conn->ssl); +} + /* * Read data from a secure connection. * diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 4ef46fff47..c3455718b6 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -641,6 +641,7 @@ extern int pgtls_init(PGconn *conn); extern PostgresPollingStatusType pgtls_open_client(PGconn *conn); extern void pgtls_close(PGconn *conn); extern ssize_t pgtls_read(PGconn *conn, void *ptr, size_t len); +extern bool pgtls_read_pending(PGconn *conn); extern ssize_t pgtls_write(PGconn *conn, const void *ptr, size_t len); /*