summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2001-07-29 23:21:31 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2001-07-29 23:21:31 +0000
commitb861a7b79ecd5f9b8622b7cfc2842404089c2285 (patch)
tree82f37f463e3aa463fa5bce00d065dcb86cd10c3b
parent1efce88bbc9e1a4901b9bed5308acc9111decb7d (diff)
downloadgnutls-b861a7b79ecd5f9b8622b7cfc2842404089c2285.tar.gz
fixes in EOF handling in handshake.
-rw-r--r--lib/gnutls_handshake.c6
-rw-r--r--lib/gnutls_record.c11
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c
index 7d86a592ba..476e419e0d 100644
--- a/lib/gnutls_handshake.c
+++ b/lib/gnutls_handshake.c
@@ -633,7 +633,7 @@ int _gnutls_recv_handshake(SOCKET cd, GNUTLS_STATE state, uint8 ** data,
if (ret <= 0) {
gnutls_assert();
gnutls_free(dataptr);
- return ret;
+ return (ret < 0)?ret:GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
}
if (ret != SSL2_HEADERS) {
gnutls_assert();
@@ -652,7 +652,7 @@ int _gnutls_recv_handshake(SOCKET cd, GNUTLS_STATE state, uint8 ** data,
if (ret <= 0) {
gnutls_assert();
gnutls_free(dataptr);
- return ret;
+ return (ret<0)?ret:GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
}
if (ret != HANDSHAKE_HEADERS_SIZE - SSL2_HEADERS) {
gnutls_assert();
@@ -1429,7 +1429,7 @@ static int _gnutls_recv_handshake_final(SOCKET cd, GNUTLS_STATE state,
if (ret <= 0) {
ERR("recv ChangeCipherSpec", ret);
gnutls_assert();
- return ret;
+ return (ret<0)?ret:GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
}
/* Initialize the connection state (start encryption) - in case of server */
diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c
index 8ad7b9db60..ce203399ca 100644
--- a/lib/gnutls_record.c
+++ b/lib/gnutls_record.c
@@ -808,9 +808,20 @@ ssize_t gnutls_recv_int(SOCKET cd, GNUTLS_STATE state, ContentType type, Handsha
return GNUTLS_E_UNEXPECTED_PACKET;
case GNUTLS_APPLICATION_DATA:
+#if 0
/* even if data is unexpected put it into the buffer */
gnutls_insertDataBuffer(recv_type, state, (void *) tmpdata, tmplen);
/* no peeked data to clear since this packet was unexpected */
+#endif
+ /* We no longer assume this as normal, since
+ * in this case we don't leave data into kernel
+ * buffer, thus select() will not return.
+ * Return an error for now, and we'll handle
+ * it if there is a need for it.
+ */
+ gnutls_assert();
+ gnutls_free(tmpdata);
+ return GNUTLS_E_UNEXPECTED_PACKET;
break;
case GNUTLS_HANDSHAKE: