Fix return values when adding serverinfo fails.

Reviewed-by: Rich Salz <rsalz@openssl.org>
MR #1128

(cherry picked from commit fae11ec714ac8e71d95e824d7102ab5b2ec2e256)
This commit is contained in:
Kurt Roeckx 2015-09-15 21:26:32 +02:00
parent 929f6d6f55
commit 0711826ae9

View File

@ -750,31 +750,31 @@ static int serverinfo_find_extension(const unsigned char *serverinfo,
*extension_data = NULL; *extension_data = NULL;
*extension_length = 0; *extension_length = 0;
if (serverinfo == NULL || serverinfo_length == 0) if (serverinfo == NULL || serverinfo_length == 0)
return 0; return -1;
for (;;) { for (;;) {
unsigned int type = 0; unsigned int type = 0;
size_t len = 0; size_t len = 0;
/* end of serverinfo */ /* end of serverinfo */
if (serverinfo_length == 0) if (serverinfo_length == 0)
return -1; /* Extension not found */ return 0; /* Extension not found */
/* read 2-byte type field */ /* read 2-byte type field */
if (serverinfo_length < 2) if (serverinfo_length < 2)
return 0; /* Error */ return -1; /* Error */
type = (serverinfo[0] << 8) + serverinfo[1]; type = (serverinfo[0] << 8) + serverinfo[1];
serverinfo += 2; serverinfo += 2;
serverinfo_length -= 2; serverinfo_length -= 2;
/* read 2-byte len field */ /* read 2-byte len field */
if (serverinfo_length < 2) if (serverinfo_length < 2)
return 0; /* Error */ return -1; /* Error */
len = (serverinfo[0] << 8) + serverinfo[1]; len = (serverinfo[0] << 8) + serverinfo[1];
serverinfo += 2; serverinfo += 2;
serverinfo_length -= 2; serverinfo_length -= 2;
if (len > serverinfo_length) if (len > serverinfo_length)
return 0; /* Error */ return -1; /* Error */
if (type == extension_type) { if (type == extension_type) {
*extension_data = serverinfo; *extension_data = serverinfo;
@ -814,10 +814,12 @@ static int serverinfo_srv_add_cb(SSL *s, unsigned int ext_type,
/* Find the relevant extension from the serverinfo */ /* Find the relevant extension from the serverinfo */
int retval = serverinfo_find_extension(serverinfo, serverinfo_length, int retval = serverinfo_find_extension(serverinfo, serverinfo_length,
ext_type, out, outlen); ext_type, out, outlen);
if (retval == -1) {
*al = SSL_AD_DECODE_ERROR;
return -1; /* Error */
}
if (retval == 0) if (retval == 0)
return 0; /* Error */ return 0; /* No extension found, don't send extension */
if (retval == -1)
return -1; /* No extension found, don't send extension */
return 1; /* Send extension */ return 1; /* Send extension */
} }
return -1; /* No serverinfo data found, don't send return -1; /* No serverinfo data found, don't send