|
|
109a78 |
diff --git a/src/main/tls_listen.c b/src/main/tls_listen.c
|
|
|
109a78 |
index 32cf564..45e7641 100644
|
|
|
109a78 |
--- a/src/main/tls_listen.c
|
|
|
109a78 |
+++ b/src/main/tls_listen.c
|
|
|
109a78 |
@@ -189,6 +189,18 @@ static int tls_socket_recv(rad_listen_t *listener)
|
|
|
109a78 |
|
|
|
109a78 |
RDEBUG3("Reading from socket %d", request->packet->sockfd);
|
|
|
109a78 |
PTHREAD_MUTEX_LOCK(&sock->mutex);
|
|
|
109a78 |
+
|
|
|
109a78 |
+ /*
|
|
|
109a78 |
+ * If there is pending application data, as set up by
|
|
|
109a78 |
+ * SSL_peek(), read that before reading more data from
|
|
|
109a78 |
+ * the socket.
|
|
|
109a78 |
+ */
|
|
|
109a78 |
+ if (SSL_pending(sock->ssn->ssl)) {
|
|
|
109a78 |
+ RDEBUG3("Reading pending buffered data");
|
|
|
109a78 |
+ sock->ssn->dirty_in.used = 0;
|
|
|
109a78 |
+ goto get_application_data;
|
|
|
109a78 |
+ }
|
|
|
109a78 |
+
|
|
|
109a78 |
rcode = read(request->packet->sockfd,
|
|
|
109a78 |
sock->ssn->dirty_in.data,
|
|
|
109a78 |
sizeof(sock->ssn->dirty_in.data));
|
|
|
109a78 |
@@ -250,6 +262,7 @@ static int tls_socket_recv(rad_listen_t *listener)
|
|
|
109a78 |
/*
|
|
|
109a78 |
* Try to get application data.
|
|
|
109a78 |
*/
|
|
|
109a78 |
+get_application_data:
|
|
|
109a78 |
status = tls_application_data(sock->ssn, request);
|
|
|
109a78 |
RDEBUG("Application data status %d", status);
|
|
|
109a78 |
|
|
|
109a78 |
@@ -333,9 +346,11 @@ int dual_tls_recv(rad_listen_t *listener)
|
|
|
109a78 |
RAD_REQUEST_FUNP fun = NULL;
|
|
|
109a78 |
listen_socket_t *sock = listener->data;
|
|
|
109a78 |
RADCLIENT *client = sock->client;
|
|
|
109a78 |
+ BIO *rbio;
|
|
|
109a78 |
|
|
|
109a78 |
if (listener->status != RAD_LISTEN_STATUS_KNOWN) return 0;
|
|
|
109a78 |
|
|
|
109a78 |
+redo:
|
|
|
109a78 |
if (!tls_socket_recv(listener)) {
|
|
|
109a78 |
return 0;
|
|
|
109a78 |
}
|
|
|
109a78 |
@@ -403,6 +418,26 @@ int dual_tls_recv(rad_listen_t *listener)
|
|
|
109a78 |
return 0;
|
|
|
109a78 |
}
|
|
|
109a78 |
|
|
|
109a78 |
+ /*
|
|
|
109a78 |
+ * Check for more application data.
|
|
|
109a78 |
+ *
|
|
|
109a78 |
+ * If there is pending SSL data, "peek" at the
|
|
|
109a78 |
+ * application data. If we get at least one byte of
|
|
|
109a78 |
+ * application data, go back to tls_socket_recv().
|
|
|
109a78 |
+ * SSL_peek() will set SSL_pending(), and
|
|
|
109a78 |
+ * tls_socket_recv() will read another packet.
|
|
|
109a78 |
+ */
|
|
|
109a78 |
+ rbio = SSL_get_rbio(sock->ssn->ssl);
|
|
|
109a78 |
+ if (BIO_ctrl_pending(rbio)) {
|
|
|
109a78 |
+ char buf[1];
|
|
|
109a78 |
+ int peek = SSL_peek(sock->ssn->ssl, buf, 1);
|
|
|
109a78 |
+
|
|
|
109a78 |
+ if (peek > 0) {
|
|
|
109a78 |
+ DEBUG("more TLS records after dual_tls_recv");
|
|
|
109a78 |
+ goto redo;
|
|
|
109a78 |
+ }
|
|
|
109a78 |
+ }
|
|
|
109a78 |
+
|
|
|
109a78 |
return 1;
|
|
|
109a78 |
}
|
|
|
109a78 |
|