From 5c6f76da0ae3a7797c29744987c7e874a6a91e04 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bodo=20M=C3=B6ller?= Date: Wed, 29 Nov 2006 14:45:14 +0000 Subject: [PATCH] fix support for receiving fragmented handshake messages --- CHANGES | 20 ++++++++++++++++++++ ssl/d1_pkt.c | 6 +----- ssl/s23_clnt.c | 1 - ssl/s23_srvr.c | 1 - ssl/s3_pkt.c | 6 +----- ssl/s3_srvr.c | 3 ++- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CHANGES b/CHANGES index 8a91de7eb7..e1b33745e5 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,13 @@ Changes between 0.9.8d and 0.9.8e [XX xxx XXXX] + *) Have SSL/TLS server implementation tolerate "mismatched" record + protocol version while receiving ClientHello even if the + ClientHello is fragmented. (The server can't insist on the + particular protocol version it has chosen before the ServerHello + message has informed the client about his choice.) + [Bodo Moeller] + *) Add RFC 3779 support. [Rob Austein for ARIN, Ben Laurie] @@ -1016,6 +1023,19 @@ differing sizes. [Richard Levitte] + Changes between 0.9.7l and 0.9.7m [xx XXX xxxx] + + *) Have SSL/TLS server implementation tolerate "mismatched" record + protocol version while receiving ClientHello even if the + ClientHello is fragmented. (The server can't insist on the + particular protocol version it has chosen before the ServerHello + message has informed the client about his choice.) + [Bodo Moeller] + + *) Load error codes if they are not already present instead of using a + static variable. This allows them to be cleanly unloaded and reloaded. + [Steve Henson] + Changes between 0.9.7k and 0.9.7l [28 Sep 2006] *) Introduce limits to prevent malicious keys being able to diff --git a/ssl/d1_pkt.c b/ssl/d1_pkt.c index f8f4516525..8270419a8d 100644 --- a/ssl/d1_pkt.c +++ b/ssl/d1_pkt.c @@ -533,11 +533,7 @@ again: n2s(p,rr->length); /* Lets check version */ - if (s->first_packet) - { - s->first_packet=0; - } - else + if (!s->first_packet) { if (version != s->version) { diff --git a/ssl/s23_clnt.c b/ssl/s23_clnt.c index ed4ee72393..769dabdbb8 100644 --- a/ssl/s23_clnt.c +++ b/ssl/s23_clnt.c @@ -574,7 +574,6 @@ static int ssl23_get_server_hello(SSL *s) if (!ssl_get_new_session(s,0)) goto err; - s->first_packet=1; return(SSL_connect(s)); err: return(-1); diff --git a/ssl/s23_srvr.c b/ssl/s23_srvr.c index da4f377e76..6637bb9549 100644 --- a/ssl/s23_srvr.c +++ b/ssl/s23_srvr.c @@ -565,7 +565,6 @@ int ssl23_get_client_hello(SSL *s) s->init_num=0; if (buf != buf_space) OPENSSL_free(buf); - s->first_packet=1; return(SSL_accept(s)); err: if (buf != buf_space) OPENSSL_free(buf); diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c index d0f54e297b..44c7c143fe 100644 --- a/ssl/s3_pkt.c +++ b/ssl/s3_pkt.c @@ -277,11 +277,7 @@ again: n2s(p,rr->length); /* Lets check version */ - if (s->first_packet) - { - s->first_packet=0; - } - else + if (!s->first_packet) { if (version != s->version) { diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c index 9f84e3e4dc..a74e541acb 100644 --- a/ssl/s3_srvr.c +++ b/ssl/s3_srvr.c @@ -680,9 +680,9 @@ int ssl3_get_client_hello(SSL *s) */ if (s->state == SSL3_ST_SR_CLNT_HELLO_A) { - s->first_packet=1; s->state=SSL3_ST_SR_CLNT_HELLO_B; } + s->first_packet=1; n=s->method->ssl_get_message(s, SSL3_ST_SR_CLNT_HELLO_B, SSL3_ST_SR_CLNT_HELLO_C, @@ -691,6 +691,7 @@ int ssl3_get_client_hello(SSL *s) &ok); if (!ok) return((int)n); + s->first_packet=0; d=p=(unsigned char *)s->init_msg; /* use version from inside client hello, not from record header -- 2.34.1