From: Dr. Stephen Henson Date: Fri, 5 Jun 2009 15:05:10 +0000 (+0000) Subject: Update from 1.0.0-stable. X-Git-Tag: OpenSSL_0_9_8m-beta1~198 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=1ddf6912449ca02e9cdd106f2c423117d6e2ea62;p=oweals%2Fopenssl.git Update from 1.0.0-stable. --- diff --git a/apps/s_server.c b/apps/s_server.c index 43f824b90d..23d2217625 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -284,7 +284,9 @@ static const char *session_id_prefix=NULL; static int enable_timeouts = 0; static long socket_mtu; +#ifndef OPENSSL_NO_DTLS1 static int cert_chain = 0; +#endif #ifdef MONOLITH diff --git a/crypto/bio/bss_dgram.c b/crypto/bio/bss_dgram.c index 2e1a6fac33..027cdf943b 100644 --- a/crypto/bio/bss_dgram.c +++ b/crypto/bio/bss_dgram.c @@ -217,12 +217,19 @@ static void dgram_adjust_rcv_timeout(BIO *b) timeleft.tv_usec += 1000000; } + if (timeleft.tv_sec < 0) + { + timeleft.tv_sec = 0; + timeleft.tv_usec = 1; + } + /* Adjust socket timeout if next handhake message timer * will expire earlier. */ - if (data->socket_timeout.tv_sec < timeleft.tv_sec || + if ((data->socket_timeout.tv_sec == 0 && data->socket_timeout.tv_usec == 0) || + (data->socket_timeout.tv_sec > timeleft.tv_sec) || (data->socket_timeout.tv_sec == timeleft.tv_sec && - data->socket_timeout.tv_usec <= timeleft.tv_usec)) + data->socket_timeout.tv_usec >= timeleft.tv_usec)) { #ifdef OPENSSL_SYS_WINDOWS timeout = timeleft.tv_sec * 1000 + timeleft.tv_usec / 1000; diff --git a/ssl/d1_both.c b/ssl/d1_both.c index fb74ed2763..69b6b10ba2 100644 --- a/ssl/d1_both.c +++ b/ssl/d1_both.c @@ -568,9 +568,13 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) pq_64bit_free(&seq64); /* Discard the message if sequence number was already there, is - * too far in the future or the fragment is already in the queue */ + * too far in the future, already in the queue or if we received + * a FINISHED before the SERVER_HELLO, which then must be a stale + * retransmit. + */ if (msg_hdr->seq <= s->d1->handshake_read_seq || - msg_hdr->seq > s->d1->handshake_read_seq + 10 || item != NULL) + msg_hdr->seq > s->d1->handshake_read_seq + 10 || item != NULL || + (s->d1->handshake_read_seq == 0 && msg_hdr->type == SSL3_MT_FINISHED)) { unsigned char devnull [256]; diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c index a95705448f..20d6b7c404 100644 --- a/ssl/d1_clnt.c +++ b/ssl/d1_clnt.c @@ -440,7 +440,7 @@ int dtls1_connect(SSL *s) case SSL3_ST_CR_FINISHED_A: case SSL3_ST_CR_FINISHED_B: - + s->d1->change_cipher_spec_ok = 1; ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A, SSL3_ST_CR_FINISHED_B); if (ret <= 0) goto end; diff --git a/ssl/d1_pkt.c b/ssl/d1_pkt.c index ec7752d93a..d88ef19fcd 100644 --- a/ssl/d1_pkt.c +++ b/ssl/d1_pkt.c @@ -1058,6 +1058,16 @@ start: s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, 1, s, s->msg_callback_arg); + /* We can't process a CCS now, because previous handshake + * messages are still missing, so just drop it. + */ + if (!s->d1->change_cipher_spec_ok) + { + goto start; + } + + s->d1->change_cipher_spec_ok = 0; + s->s3->change_cipher_spec=1; if (!ssl3_do_change_cipher_spec(s)) goto err; diff --git a/ssl/d1_srvr.c b/ssl/d1_srvr.c index 49671570b3..992b6a742e 100644 --- a/ssl/d1_srvr.c +++ b/ssl/d1_srvr.c @@ -470,6 +470,7 @@ int dtls1_accept(SSL *s) case SSL3_ST_SR_CERT_VRFY_A: case SSL3_ST_SR_CERT_VRFY_B: + s->d1->change_cipher_spec_ok = 1; /* we should decide if we expected this one */ ret=ssl3_get_cert_verify(s); if (ret <= 0) goto end; @@ -481,6 +482,7 @@ int dtls1_accept(SSL *s) case SSL3_ST_SR_FINISHED_A: case SSL3_ST_SR_FINISHED_B: + s->d1->change_cipher_spec_ok = 1; ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A, SSL3_ST_SR_FINISHED_B); if (ret <= 0) goto end; diff --git a/ssl/dtls1.h b/ssl/dtls1.h index 091d7f0998..03774ec7e4 100644 --- a/ssl/dtls1.h +++ b/ssl/dtls1.h @@ -229,6 +229,7 @@ typedef struct dtls1_state_st unsigned int handshake_fragment_len; unsigned int retransmitting; + unsigned int change_cipher_spec_ok; } DTLS1_STATE;