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