diff options
author | Adam Langley <agl@imperialviolet.org> | 2014-06-06 14:19:21 -0700 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2014-08-06 20:41:23 +0100 |
commit | 49850075555893c9c60d5b981deb697f3b9515ea (patch) | |
tree | aaf2dbd3a94db8f39df553e0366ed68b6b12f0d6 /ssl/d1_both.c | |
parent | 89d2f8f1a973c42ef24fe9d6d5b57be1c536c32e (diff) |
Avoid double free when processing DTLS packets.
The |item| variable, in both of these cases, may contain a pointer to a
|pitem| structure within |s->d1->buffered_messages|. It was being freed
in the error case while still being in |buffered_messages|. When the
error later caused the |SSL*| to be destroyed, the item would be double
freed.
Thanks to Wah-Teh Chang for spotting that the fix in 1632ef74 was
inconsistent with the other error paths (but correct).
Fixes CVE-2014-3505
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Emilia Käsper <emilia@openssl.org>
Diffstat (limited to 'ssl/d1_both.c')
-rw-r--r-- | ssl/d1_both.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/ssl/d1_both.c b/ssl/d1_both.c index 51d484d7ea..b720a54311 100644 --- a/ssl/d1_both.c +++ b/ssl/d1_both.c @@ -698,8 +698,7 @@ dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) return DTLS1_HM_FRAGMENT_RETRY; err: - if (frag != NULL) dtls1_hm_fragment_free(frag); - if (item != NULL) OPENSSL_free(item); + if (frag != NULL && item == NULL) dtls1_hm_fragment_free(frag); *ok = 0; return i; } @@ -783,8 +782,7 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) return DTLS1_HM_FRAGMENT_RETRY; err: - if ( frag != NULL) dtls1_hm_fragment_free(frag); - if ( item != NULL) OPENSSL_free(item); + if (frag != NULL && item == NULL) dtls1_hm_fragment_free(frag); *ok = 0; return i; } |