Change functions to pass in a limit rather than calculate it
Some extension handling functions were passing in a pointer to the start of the data, plus the length in order to calculate the end, rather than just passing in the end to start with. This change makes things a little more readable. Reviewed-by: Emilia Käsper <emilia@openssl.org> Conflicts: ssl/s3_srvr.c ssl/ssl_locl.h ssl/t1_lib.c
This commit is contained in:
parent
e4840c88c5
commit
f141376ae2
@ -1264,7 +1264,7 @@ int ssl3_get_client_hello(SSL *s)
|
|||||||
#ifndef OPENSSL_NO_TLSEXT
|
#ifndef OPENSSL_NO_TLSEXT
|
||||||
/* TLS extensions */
|
/* TLS extensions */
|
||||||
if (s->version >= SSL3_VERSION) {
|
if (s->version >= SSL3_VERSION) {
|
||||||
if (!ssl_parse_clienthello_tlsext(s, &p, d, n, &al)) {
|
if (!ssl_parse_clienthello_tlsext(s, &p, d + n, &al)) {
|
||||||
/* 'al' set by ssl_parse_clienthello_tlsext */
|
/* 'al' set by ssl_parse_clienthello_tlsext */
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT);
|
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT);
|
||||||
goto f_err;
|
goto f_err;
|
||||||
|
@ -1154,7 +1154,7 @@ unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf,
|
|||||||
unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
|
unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
|
||||||
unsigned char *limit);
|
unsigned char *limit);
|
||||||
int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data,
|
int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data,
|
||||||
unsigned char *d, int n, int *al);
|
unsigned char *limit, int *al);
|
||||||
int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data,
|
int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data,
|
||||||
unsigned char *d, int n, int *al);
|
unsigned char *d, int n, int *al);
|
||||||
int ssl_prepare_clienthello_tlsext(SSL *s);
|
int ssl_prepare_clienthello_tlsext(SSL *s);
|
||||||
|
30
ssl/t1_lib.c
30
ssl/t1_lib.c
@ -913,7 +913,7 @@ unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
|
|||||||
* 10.8..10.8.3 (which don't work).
|
* 10.8..10.8.3 (which don't work).
|
||||||
*/
|
*/
|
||||||
static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
||||||
const unsigned char *d, int n)
|
const unsigned char *limit)
|
||||||
{
|
{
|
||||||
unsigned short type, size;
|
unsigned short type, size;
|
||||||
static const unsigned char kSafariExtensionsBlock[] = {
|
static const unsigned char kSafariExtensionsBlock[] = {
|
||||||
@ -942,11 +942,11 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
|||||||
0x02, 0x03, /* SHA-1/ECDSA */
|
0x02, 0x03, /* SHA-1/ECDSA */
|
||||||
};
|
};
|
||||||
|
|
||||||
if (data >= (d + n - 2))
|
if (data >= (limit - 2))
|
||||||
return;
|
return;
|
||||||
data += 2;
|
data += 2;
|
||||||
|
|
||||||
if (data > (d + n - 4))
|
if (data > (limit - 4))
|
||||||
return;
|
return;
|
||||||
n2s(data, type);
|
n2s(data, type);
|
||||||
n2s(data, size);
|
n2s(data, size);
|
||||||
@ -954,7 +954,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
|||||||
if (type != TLSEXT_TYPE_server_name)
|
if (type != TLSEXT_TYPE_server_name)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (data + size > d + n)
|
if (data + size > limit)
|
||||||
return;
|
return;
|
||||||
data += size;
|
data += size;
|
||||||
|
|
||||||
@ -962,7 +962,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
|||||||
const size_t len1 = sizeof(kSafariExtensionsBlock);
|
const size_t len1 = sizeof(kSafariExtensionsBlock);
|
||||||
const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
|
const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
|
||||||
|
|
||||||
if (data + len1 + len2 != d + n)
|
if (data + len1 + len2 != limit)
|
||||||
return;
|
return;
|
||||||
if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
|
if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
|
||||||
return;
|
return;
|
||||||
@ -971,7 +971,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
|||||||
} else {
|
} else {
|
||||||
const size_t len = sizeof(kSafariExtensionsBlock);
|
const size_t len = sizeof(kSafariExtensionsBlock);
|
||||||
|
|
||||||
if (data + len != d + n)
|
if (data + len != limit)
|
||||||
return;
|
return;
|
||||||
if (memcmp(data, kSafariExtensionsBlock, len) != 0)
|
if (memcmp(data, kSafariExtensionsBlock, len) != 0)
|
||||||
return;
|
return;
|
||||||
@ -981,8 +981,8 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
|
|||||||
}
|
}
|
||||||
# endif /* !OPENSSL_NO_EC */
|
# endif /* !OPENSSL_NO_EC */
|
||||||
|
|
||||||
int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
|
int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p,
|
||||||
int n, int *al)
|
unsigned char *limit, int *al)
|
||||||
{
|
{
|
||||||
unsigned short type;
|
unsigned short type;
|
||||||
unsigned short size;
|
unsigned short size;
|
||||||
@ -1004,7 +1004,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
|
|||||||
|
|
||||||
# ifndef OPENSSL_NO_EC
|
# ifndef OPENSSL_NO_EC
|
||||||
if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
|
if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
|
||||||
ssl_check_for_safari(s, data, d, n);
|
ssl_check_for_safari(s, data, limit);
|
||||||
# endif /* !OPENSSL_NO_EC */
|
# endif /* !OPENSSL_NO_EC */
|
||||||
|
|
||||||
# ifndef OPENSSL_NO_SRP
|
# ifndef OPENSSL_NO_SRP
|
||||||
@ -1016,22 +1016,22 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
|
|||||||
|
|
||||||
s->srtp_profile = NULL;
|
s->srtp_profile = NULL;
|
||||||
|
|
||||||
if (data == d + n)
|
if (data == limit)
|
||||||
goto ri_check;
|
goto ri_check;
|
||||||
|
|
||||||
if (data > (d + n - 2))
|
if (data > (limit - 2))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
n2s(data, len);
|
n2s(data, len);
|
||||||
|
|
||||||
if (data + len != d + n)
|
if (data + len != limit)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
while (data <= (d + n - 4)) {
|
while (data <= (limit - 4)) {
|
||||||
n2s(data, type);
|
n2s(data, type);
|
||||||
n2s(data, size);
|
n2s(data, size);
|
||||||
|
|
||||||
if (data + size > (d + n))
|
if (data + size > (limit))
|
||||||
goto err;
|
goto err;
|
||||||
# if 0
|
# if 0
|
||||||
fprintf(stderr, "Received extension type %d size %d\n", type, size);
|
fprintf(stderr, "Received extension type %d size %d\n", type, size);
|
||||||
@ -1396,7 +1396,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Spurious data on the end */
|
/* Spurious data on the end */
|
||||||
if (data != d + n)
|
if (data != limit)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
*p = data;
|
*p = data;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user