Error out immediately on empty ciphers list.
A 0-length ciphers list is never permitted. The old code only used to reject an empty ciphers list for connections with a session ID. It would later error out on a NULL structure, so this change just moves the alert closer to the problem source. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
13efe9d17e
commit
3ae91cfb32
1 changed files with 6 additions and 7 deletions
|
@ -1126,8 +1126,8 @@ int ssl3_get_client_hello(SSL *s)
|
||||||
goto f_err;
|
goto f_err;
|
||||||
}
|
}
|
||||||
n2s(p, i);
|
n2s(p, i);
|
||||||
if ((i == 0) && (j != 0)) {
|
|
||||||
/* we need a cipher if we are not resuming a session */
|
if (i == 0) {
|
||||||
al = SSL_AD_ILLEGAL_PARAMETER;
|
al = SSL_AD_ILLEGAL_PARAMETER;
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_CIPHERS_SPECIFIED);
|
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_CIPHERS_SPECIFIED);
|
||||||
goto f_err;
|
goto f_err;
|
||||||
|
@ -1140,14 +1140,13 @@ int ssl3_get_client_hello(SSL *s)
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
|
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_LENGTH_MISMATCH);
|
||||||
goto f_err;
|
goto f_err;
|
||||||
}
|
}
|
||||||
if ((i > 0) && (ssl_bytes_to_cipher_list(s, p, i, &(ciphers))
|
if (ssl_bytes_to_cipher_list(s, p, i, &(ciphers)) == NULL) {
|
||||||
== NULL)) {
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
p += i;
|
p += i;
|
||||||
|
|
||||||
/* If it is a hit, check that the cipher is in the list */
|
/* If it is a hit, check that the cipher is in the list */
|
||||||
if ((s->hit) && (i > 0)) {
|
if (s->hit) {
|
||||||
j = 0;
|
j = 0;
|
||||||
id = s->session->cipher->id;
|
id = s->session->cipher->id;
|
||||||
|
|
||||||
|
@ -1376,8 +1375,8 @@ int ssl3_get_client_hello(SSL *s)
|
||||||
sk_SSL_CIPHER_free(s->session->ciphers);
|
sk_SSL_CIPHER_free(s->session->ciphers);
|
||||||
s->session->ciphers = ciphers;
|
s->session->ciphers = ciphers;
|
||||||
if (ciphers == NULL) {
|
if (ciphers == NULL) {
|
||||||
al = SSL_AD_ILLEGAL_PARAMETER;
|
al = SSL_AD_INTERNAL_ERROR;
|
||||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_CIPHERS_PASSED);
|
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
|
||||||
goto f_err;
|
goto f_err;
|
||||||
}
|
}
|
||||||
ciphers = NULL;
|
ciphers = NULL;
|
||||||
|
|
Loading…
Reference in a new issue