diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/s3_srvr.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c index 9fe96de53e..d2a03e05d2 100644 --- a/src/lib/libssl/s3_srvr.c +++ b/src/lib/libssl/s3_srvr.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_srvr.c,v 1.126 2016/05/30 13:42:54 beck Exp $ */ | 1 | /* $OpenBSD: s3_srvr.c,v 1.127 2016/09/22 07:17:41 guenther Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -776,21 +776,26 @@ ssl3_get_client_hello(SSL *s) | |||
| 776 | } | 776 | } |
| 777 | 777 | ||
| 778 | /* | 778 | /* |
| 779 | * If we require cookies and this ClientHello doesn't | 779 | * If we require cookies (DTLS) and this ClientHello doesn't |
| 780 | * contain one, just return since we do not want to | 780 | * contain one, just return since we do not want to |
| 781 | * allocate any memory yet. So check cookie length... | 781 | * allocate any memory yet. So check cookie length... |
| 782 | */ | 782 | */ |
| 783 | if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { | 783 | if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) { |
| 784 | unsigned int session_length, cookie_length; | 784 | unsigned int session_length, cookie_length; |
| 785 | 785 | ||
| 786 | if (p - d + SSL3_RANDOM_SIZE + 1 >= n) | ||
| 787 | goto truncated; | ||
| 786 | session_length = *(p + SSL3_RANDOM_SIZE); | 788 | session_length = *(p + SSL3_RANDOM_SIZE); |
| 787 | cookie_length = *(p + SSL3_RANDOM_SIZE + session_length + 1); | 789 | |
| 790 | if (p - d + SSL3_RANDOM_SIZE + session_length + 1 >= n) | ||
| 791 | goto truncated; | ||
| 792 | cookie_length = p[SSL3_RANDOM_SIZE + session_length + 1]; | ||
| 788 | 793 | ||
| 789 | if (cookie_length == 0) | 794 | if (cookie_length == 0) |
| 790 | return (1); | 795 | return (1); |
| 791 | } | 796 | } |
| 792 | 797 | ||
| 793 | if (p + SSL3_RANDOM_SIZE + 1 - d > n) | 798 | if (p - d + SSL3_RANDOM_SIZE + 1 > n) |
| 794 | goto truncated; | 799 | goto truncated; |
| 795 | 800 | ||
| 796 | /* load the client random */ | 801 | /* load the client random */ |
| @@ -799,7 +804,7 @@ ssl3_get_client_hello(SSL *s) | |||
| 799 | 804 | ||
| 800 | /* get the session-id */ | 805 | /* get the session-id */ |
| 801 | j= *(p++); | 806 | j= *(p++); |
| 802 | if (p + j - d > n) | 807 | if (p - d + j > n) |
| 803 | goto truncated; | 808 | goto truncated; |
| 804 | 809 | ||
| 805 | s->hit = 0; | 810 | s->hit = 0; |
| @@ -839,7 +844,7 @@ ssl3_get_client_hello(SSL *s) | |||
| 839 | 844 | ||
| 840 | if (SSL_IS_DTLS(s)) { | 845 | if (SSL_IS_DTLS(s)) { |
| 841 | /* cookie stuff */ | 846 | /* cookie stuff */ |
| 842 | if (p + 1 - d > n) | 847 | if (p - d + 1 > n) |
| 843 | goto truncated; | 848 | goto truncated; |
| 844 | cookie_len = *(p++); | 849 | cookie_len = *(p++); |
| 845 | 850 | ||
| @@ -856,7 +861,7 @@ ssl3_get_client_hello(SSL *s) | |||
| 856 | goto f_err; | 861 | goto f_err; |
| 857 | } | 862 | } |
| 858 | 863 | ||
| 859 | if (p + cookie_len - d > n) | 864 | if (p - d + cookie_len > n) |
| 860 | goto truncated; | 865 | goto truncated; |
| 861 | 866 | ||
| 862 | /* verify the cookie if appropriate option is set. */ | 867 | /* verify the cookie if appropriate option is set. */ |
| @@ -888,7 +893,7 @@ ssl3_get_client_hello(SSL *s) | |||
| 888 | p += cookie_len; | 893 | p += cookie_len; |
| 889 | } | 894 | } |
| 890 | 895 | ||
| 891 | if (p + 2 - d > n) | 896 | if (p - d + 2 > n) |
| 892 | goto truncated; | 897 | goto truncated; |
| 893 | n2s(p, i); | 898 | n2s(p, i); |
| 894 | if ((i == 0) && (j != 0)) { | 899 | if ((i == 0) && (j != 0)) { |
| @@ -898,7 +903,7 @@ ssl3_get_client_hello(SSL *s) | |||
| 898 | SSL_R_NO_CIPHERS_SPECIFIED); | 903 | SSL_R_NO_CIPHERS_SPECIFIED); |
| 899 | goto f_err; | 904 | goto f_err; |
| 900 | } | 905 | } |
| 901 | if (p + i - d > n) | 906 | if (p - d + i > n) |
| 902 | goto truncated; | 907 | goto truncated; |
| 903 | if (i > 0) { | 908 | if (i > 0) { |
| 904 | if ((ciphers = ssl_bytes_to_cipher_list(s, p, i)) == NULL) | 909 | if ((ciphers = ssl_bytes_to_cipher_list(s, p, i)) == NULL) |
| @@ -931,10 +936,10 @@ ssl3_get_client_hello(SSL *s) | |||
| 931 | } | 936 | } |
| 932 | 937 | ||
| 933 | /* compression */ | 938 | /* compression */ |
| 934 | if (p + 1 - d > n) | 939 | if (p - d + 1 > n) |
| 935 | goto truncated; | 940 | goto truncated; |
| 936 | i= *(p++); | 941 | i= *(p++); |
| 937 | if (p + i - d > n) | 942 | if (p - d + i > n) |
| 938 | goto truncated; | 943 | goto truncated; |
| 939 | for (j = 0; j < i; j++) { | 944 | for (j = 0; j < i; j++) { |
| 940 | if (p[j] == 0) | 945 | if (p[j] == 0) |
| @@ -1655,7 +1660,7 @@ ssl3_get_client_key_exchange(SSL *s) | |||
| 1655 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ | 1660 | /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */ |
| 1656 | } | 1661 | } |
| 1657 | 1662 | ||
| 1658 | if (p + 2 - d > n) /* needed in the SSL3 case */ | 1663 | if (p - d + 2 > n) /* needed in the SSL3 case */ |
| 1659 | goto truncated; | 1664 | goto truncated; |
| 1660 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && | 1665 | if ((al == -1) && !((p[0] == (s->client_version >> 8)) && |
| 1661 | (p[1] == (s->client_version & 0xff)))) { | 1666 | (p[1] == (s->client_version & 0xff)))) { |
