diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/src/ssl/t1_lib.c | 54 | ||||
-rw-r--r-- | src/lib/libssl/t1_lib.c | 54 |
2 files changed, 74 insertions, 34 deletions
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c index 7230dec671..3022469ea9 100644 --- a/src/lib/libssl/src/ssl/t1_lib.c +++ b/src/lib/libssl/src/ssl/t1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: t1_lib.c,v 1.87 2016/05/30 13:42:54 beck Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.88 2016/08/27 15:58:06 jsing 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 | * |
@@ -1206,6 +1206,7 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1206 | unsigned short size; | 1206 | unsigned short size; |
1207 | unsigned short len; | 1207 | unsigned short len; |
1208 | unsigned char *data = *p; | 1208 | unsigned char *data = *p; |
1209 | unsigned char *end = d + n; | ||
1209 | int renegotiate_seen = 0; | 1210 | int renegotiate_seen = 0; |
1210 | int sigalg_seen = 0; | 1211 | int sigalg_seen = 0; |
1211 | 1212 | ||
@@ -1214,20 +1215,25 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1214 | s->s3->next_proto_neg_seen = 0; | 1215 | s->s3->next_proto_neg_seen = 0; |
1215 | free(s->s3->alpn_selected); | 1216 | free(s->s3->alpn_selected); |
1216 | s->s3->alpn_selected = NULL; | 1217 | s->s3->alpn_selected = NULL; |
1218 | s->srtp_profile = NULL; | ||
1217 | 1219 | ||
1218 | if (data >= (d + n - 2)) | 1220 | if (data == end) |
1219 | goto ri_check; | 1221 | goto ri_check; |
1222 | |||
1223 | if (end - data < 2) | ||
1224 | goto err; | ||
1220 | n2s(data, len); | 1225 | n2s(data, len); |
1221 | 1226 | ||
1222 | if (data > (d + n - len)) | 1227 | if (end - data != len) |
1223 | goto ri_check; | 1228 | goto err; |
1224 | 1229 | ||
1225 | while (data <= (d + n - 4)) { | 1230 | while (end - data >= 4) { |
1226 | n2s(data, type); | 1231 | n2s(data, type); |
1227 | n2s(data, size); | 1232 | n2s(data, size); |
1228 | 1233 | ||
1229 | if (data + size > (d + n)) | 1234 | if (end - data < size) |
1230 | goto ri_check; | 1235 | goto err; |
1236 | |||
1231 | if (s->tlsext_debug_cb) | 1237 | if (s->tlsext_debug_cb) |
1232 | s->tlsext_debug_cb(s, 0, type, data, size, | 1238 | s->tlsext_debug_cb(s, 0, type, data, size, |
1233 | s->tlsext_debug_arg); | 1239 | s->tlsext_debug_arg); |
@@ -1560,6 +1566,10 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1560 | data += size; | 1566 | data += size; |
1561 | } | 1567 | } |
1562 | 1568 | ||
1569 | /* Spurious data on the end */ | ||
1570 | if (data != end) | ||
1571 | goto err; | ||
1572 | |||
1563 | *p = data; | 1573 | *p = data; |
1564 | 1574 | ||
1565 | ri_check: | 1575 | ri_check: |
@@ -1574,6 +1584,10 @@ ri_check: | |||
1574 | } | 1584 | } |
1575 | 1585 | ||
1576 | return 1; | 1586 | return 1; |
1587 | |||
1588 | err: | ||
1589 | *al = SSL_AD_DECODE_ERROR; | ||
1590 | return 0; | ||
1577 | } | 1591 | } |
1578 | 1592 | ||
1579 | /* | 1593 | /* |
@@ -1599,10 +1613,11 @@ int | |||
1599 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | 1613 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, |
1600 | int n, int *al) | 1614 | int n, int *al) |
1601 | { | 1615 | { |
1602 | unsigned short length; | ||
1603 | unsigned short type; | 1616 | unsigned short type; |
1604 | unsigned short size; | 1617 | unsigned short size; |
1618 | unsigned short len; | ||
1605 | unsigned char *data = *p; | 1619 | unsigned char *data = *p; |
1620 | unsigned char *end = d + n; | ||
1606 | int tlsext_servername = 0; | 1621 | int tlsext_servername = 0; |
1607 | int renegotiate_seen = 0; | 1622 | int renegotiate_seen = 0; |
1608 | 1623 | ||
@@ -1610,21 +1625,22 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1610 | free(s->s3->alpn_selected); | 1625 | free(s->s3->alpn_selected); |
1611 | s->s3->alpn_selected = NULL; | 1626 | s->s3->alpn_selected = NULL; |
1612 | 1627 | ||
1613 | if (data >= (d + n - 2)) | 1628 | if (data == end) |
1614 | goto ri_check; | 1629 | goto ri_check; |
1615 | 1630 | ||
1616 | n2s(data, length); | 1631 | if (end - data < 2) |
1617 | if (data + length != d + n) { | 1632 | goto err; |
1618 | *al = SSL_AD_DECODE_ERROR; | 1633 | n2s(data, len); |
1619 | return 0; | 1634 | |
1620 | } | 1635 | if (end - data != len) |
1636 | goto err; | ||
1621 | 1637 | ||
1622 | while (data <= (d + n - 4)) { | 1638 | while (end - data >= 4) { |
1623 | n2s(data, type); | 1639 | n2s(data, type); |
1624 | n2s(data, size); | 1640 | n2s(data, size); |
1625 | 1641 | ||
1626 | if (data + size > (d + n)) | 1642 | if (end - data < size) |
1627 | goto ri_check; | 1643 | goto err; |
1628 | 1644 | ||
1629 | if (s->tlsext_debug_cb) | 1645 | if (s->tlsext_debug_cb) |
1630 | s->tlsext_debug_cb(s, 1, type, data, size, | 1646 | s->tlsext_debug_cb(s, 1, type, data, size, |
@@ -1818,6 +1834,10 @@ ri_check: | |||
1818 | } | 1834 | } |
1819 | 1835 | ||
1820 | return 1; | 1836 | return 1; |
1837 | |||
1838 | err: | ||
1839 | *al = SSL_AD_DECODE_ERROR; | ||
1840 | return 0; | ||
1821 | } | 1841 | } |
1822 | 1842 | ||
1823 | int | 1843 | int |
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 7230dec671..3022469ea9 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: t1_lib.c,v 1.87 2016/05/30 13:42:54 beck Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.88 2016/08/27 15:58:06 jsing 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 | * |
@@ -1206,6 +1206,7 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1206 | unsigned short size; | 1206 | unsigned short size; |
1207 | unsigned short len; | 1207 | unsigned short len; |
1208 | unsigned char *data = *p; | 1208 | unsigned char *data = *p; |
1209 | unsigned char *end = d + n; | ||
1209 | int renegotiate_seen = 0; | 1210 | int renegotiate_seen = 0; |
1210 | int sigalg_seen = 0; | 1211 | int sigalg_seen = 0; |
1211 | 1212 | ||
@@ -1214,20 +1215,25 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1214 | s->s3->next_proto_neg_seen = 0; | 1215 | s->s3->next_proto_neg_seen = 0; |
1215 | free(s->s3->alpn_selected); | 1216 | free(s->s3->alpn_selected); |
1216 | s->s3->alpn_selected = NULL; | 1217 | s->s3->alpn_selected = NULL; |
1218 | s->srtp_profile = NULL; | ||
1217 | 1219 | ||
1218 | if (data >= (d + n - 2)) | 1220 | if (data == end) |
1219 | goto ri_check; | 1221 | goto ri_check; |
1222 | |||
1223 | if (end - data < 2) | ||
1224 | goto err; | ||
1220 | n2s(data, len); | 1225 | n2s(data, len); |
1221 | 1226 | ||
1222 | if (data > (d + n - len)) | 1227 | if (end - data != len) |
1223 | goto ri_check; | 1228 | goto err; |
1224 | 1229 | ||
1225 | while (data <= (d + n - 4)) { | 1230 | while (end - data >= 4) { |
1226 | n2s(data, type); | 1231 | n2s(data, type); |
1227 | n2s(data, size); | 1232 | n2s(data, size); |
1228 | 1233 | ||
1229 | if (data + size > (d + n)) | 1234 | if (end - data < size) |
1230 | goto ri_check; | 1235 | goto err; |
1236 | |||
1231 | if (s->tlsext_debug_cb) | 1237 | if (s->tlsext_debug_cb) |
1232 | s->tlsext_debug_cb(s, 0, type, data, size, | 1238 | s->tlsext_debug_cb(s, 0, type, data, size, |
1233 | s->tlsext_debug_arg); | 1239 | s->tlsext_debug_arg); |
@@ -1560,6 +1566,10 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1560 | data += size; | 1566 | data += size; |
1561 | } | 1567 | } |
1562 | 1568 | ||
1569 | /* Spurious data on the end */ | ||
1570 | if (data != end) | ||
1571 | goto err; | ||
1572 | |||
1563 | *p = data; | 1573 | *p = data; |
1564 | 1574 | ||
1565 | ri_check: | 1575 | ri_check: |
@@ -1574,6 +1584,10 @@ ri_check: | |||
1574 | } | 1584 | } |
1575 | 1585 | ||
1576 | return 1; | 1586 | return 1; |
1587 | |||
1588 | err: | ||
1589 | *al = SSL_AD_DECODE_ERROR; | ||
1590 | return 0; | ||
1577 | } | 1591 | } |
1578 | 1592 | ||
1579 | /* | 1593 | /* |
@@ -1599,10 +1613,11 @@ int | |||
1599 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | 1613 | ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, |
1600 | int n, int *al) | 1614 | int n, int *al) |
1601 | { | 1615 | { |
1602 | unsigned short length; | ||
1603 | unsigned short type; | 1616 | unsigned short type; |
1604 | unsigned short size; | 1617 | unsigned short size; |
1618 | unsigned short len; | ||
1605 | unsigned char *data = *p; | 1619 | unsigned char *data = *p; |
1620 | unsigned char *end = d + n; | ||
1606 | int tlsext_servername = 0; | 1621 | int tlsext_servername = 0; |
1607 | int renegotiate_seen = 0; | 1622 | int renegotiate_seen = 0; |
1608 | 1623 | ||
@@ -1610,21 +1625,22 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, | |||
1610 | free(s->s3->alpn_selected); | 1625 | free(s->s3->alpn_selected); |
1611 | s->s3->alpn_selected = NULL; | 1626 | s->s3->alpn_selected = NULL; |
1612 | 1627 | ||
1613 | if (data >= (d + n - 2)) | 1628 | if (data == end) |
1614 | goto ri_check; | 1629 | goto ri_check; |
1615 | 1630 | ||
1616 | n2s(data, length); | 1631 | if (end - data < 2) |
1617 | if (data + length != d + n) { | 1632 | goto err; |
1618 | *al = SSL_AD_DECODE_ERROR; | 1633 | n2s(data, len); |
1619 | return 0; | 1634 | |
1620 | } | 1635 | if (end - data != len) |
1636 | goto err; | ||
1621 | 1637 | ||
1622 | while (data <= (d + n - 4)) { | 1638 | while (end - data >= 4) { |
1623 | n2s(data, type); | 1639 | n2s(data, type); |
1624 | n2s(data, size); | 1640 | n2s(data, size); |
1625 | 1641 | ||
1626 | if (data + size > (d + n)) | 1642 | if (end - data < size) |
1627 | goto ri_check; | 1643 | goto err; |
1628 | 1644 | ||
1629 | if (s->tlsext_debug_cb) | 1645 | if (s->tlsext_debug_cb) |
1630 | s->tlsext_debug_cb(s, 1, type, data, size, | 1646 | s->tlsext_debug_cb(s, 1, type, data, size, |
@@ -1818,6 +1834,10 @@ ri_check: | |||
1818 | } | 1834 | } |
1819 | 1835 | ||
1820 | return 1; | 1836 | return 1; |
1837 | |||
1838 | err: | ||
1839 | *al = SSL_AD_DECODE_ERROR; | ||
1840 | return 0; | ||
1821 | } | 1841 | } |
1822 | 1842 | ||
1823 | int | 1843 | int |