diff options
author | doug <> | 2015-01-12 02:15:23 +0000 |
---|---|---|
committer | doug <> | 2015-01-12 02:15:23 +0000 |
commit | 78e14d851752a1a303981a71b71c1a9801d72b49 (patch) | |
tree | 454a5c49cf61c41fe6e4c8ca7f6d1179d16b8602 | |
parent | ef8f7774eedac8fd4363abb7a6aa2a1addcd2bb0 (diff) | |
download | openbsd-78e14d851752a1a303981a71b71c1a9801d72b49.tar.gz openbsd-78e14d851752a1a303981a71b71c1a9801d72b49.tar.bz2 openbsd-78e14d851752a1a303981a71b71c1a9801d72b49.zip |
Fix a memory leak in bss_dgram.
Free data->saved_message.data. Based on OpenSSL commit:
41cd41c4416f545a18ead37e09e437c75fa07c95 except this version sets a->ptr
to NULL to avoid accidental reuse and handles malloc failing.
ok beck@, input + ok miod@
-rw-r--r-- | src/lib/libcrypto/bio/bss_dgram.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/bio/bss_dgram.c | 16 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c index c6b552eb32..ecf12fcb33 100644 --- a/src/lib/libcrypto/bio/bss_dgram.c +++ b/src/lib/libcrypto/bio/bss_dgram.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bss_dgram.c,v 1.38 2015/01/03 18:07:29 doug Exp $ */ | 1 | /* $OpenBSD: bss_dgram.c,v 1.39 2015/01/12 02:15:23 doug Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -826,7 +826,11 @@ dgram_sctp_free(BIO *a) | |||
826 | return 0; | 826 | return 0; |
827 | 827 | ||
828 | data = (bio_dgram_sctp_data *)a->ptr; | 828 | data = (bio_dgram_sctp_data *)a->ptr; |
829 | free(data); | 829 | if (data != NULL) { |
830 | free(data->saved_message.data); | ||
831 | free(data); | ||
832 | a->ptr = NULL; | ||
833 | } | ||
830 | 834 | ||
831 | return (1); | 835 | return (1); |
832 | } | 836 | } |
@@ -934,6 +938,7 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
934 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, | 938 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, |
935 | data->saved_message.length); | 939 | data->saved_message.length); |
936 | free(data->saved_message.data); | 940 | free(data->saved_message.data); |
941 | data->saved_message.data = NULL; | ||
937 | data->saved_message.length = 0; | 942 | data->saved_message.length = 0; |
938 | } | 943 | } |
939 | 944 | ||
@@ -1101,9 +1106,14 @@ dgram_sctp_write(BIO *b, const char *in, int inl) | |||
1101 | */ | 1106 | */ |
1102 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { | 1107 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { |
1103 | data->saved_message.bio = b; | 1108 | data->saved_message.bio = b; |
1104 | data->saved_message.length = inl; | 1109 | free(data->saved_message.data); |
1105 | data->saved_message.data = malloc(inl); | 1110 | data->saved_message.data = malloc(inl); |
1111 | if (data->saved_message.data == NULL) { | ||
1112 | data->_errno = ENOMEM; | ||
1113 | return -1; | ||
1114 | } | ||
1106 | memcpy(data->saved_message.data, in, inl); | 1115 | memcpy(data->saved_message.data, in, inl); |
1116 | data->saved_message.length = inl; | ||
1107 | return inl; | 1117 | return inl; |
1108 | } | 1118 | } |
1109 | 1119 | ||
diff --git a/src/lib/libssl/src/crypto/bio/bss_dgram.c b/src/lib/libssl/src/crypto/bio/bss_dgram.c index c6b552eb32..ecf12fcb33 100644 --- a/src/lib/libssl/src/crypto/bio/bss_dgram.c +++ b/src/lib/libssl/src/crypto/bio/bss_dgram.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: bss_dgram.c,v 1.38 2015/01/03 18:07:29 doug Exp $ */ | 1 | /* $OpenBSD: bss_dgram.c,v 1.39 2015/01/12 02:15:23 doug Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -826,7 +826,11 @@ dgram_sctp_free(BIO *a) | |||
826 | return 0; | 826 | return 0; |
827 | 827 | ||
828 | data = (bio_dgram_sctp_data *)a->ptr; | 828 | data = (bio_dgram_sctp_data *)a->ptr; |
829 | free(data); | 829 | if (data != NULL) { |
830 | free(data->saved_message.data); | ||
831 | free(data); | ||
832 | a->ptr = NULL; | ||
833 | } | ||
830 | 834 | ||
831 | return (1); | 835 | return (1); |
832 | } | 836 | } |
@@ -934,6 +938,7 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
934 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, | 938 | dgram_sctp_write(data->saved_message.bio, data->saved_message.data, |
935 | data->saved_message.length); | 939 | data->saved_message.length); |
936 | free(data->saved_message.data); | 940 | free(data->saved_message.data); |
941 | data->saved_message.data = NULL; | ||
937 | data->saved_message.length = 0; | 942 | data->saved_message.length = 0; |
938 | } | 943 | } |
939 | 944 | ||
@@ -1101,9 +1106,14 @@ dgram_sctp_write(BIO *b, const char *in, int inl) | |||
1101 | */ | 1106 | */ |
1102 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { | 1107 | if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) { |
1103 | data->saved_message.bio = b; | 1108 | data->saved_message.bio = b; |
1104 | data->saved_message.length = inl; | 1109 | free(data->saved_message.data); |
1105 | data->saved_message.data = malloc(inl); | 1110 | data->saved_message.data = malloc(inl); |
1111 | if (data->saved_message.data == NULL) { | ||
1112 | data->_errno = ENOMEM; | ||
1113 | return -1; | ||
1114 | } | ||
1106 | memcpy(data->saved_message.data, in, inl); | 1115 | memcpy(data->saved_message.data, in, inl); |
1116 | data->saved_message.length = inl; | ||
1107 | return inl; | 1117 | return inl; |
1108 | } | 1118 | } |
1109 | 1119 | ||