mirror of
https://github.com/QuasarApp/openssl.git
synced 2025-04-28 18:54:36 +00:00
Fix instances of pointer addition with the NULL pointer
Addition using the NULL pointer (even when adding 0) is undefined behaviour. Recent versions of ubsan are now complaining about this, so we fix various instances. Reviewed-by: Paul Dale <paul.dale@oracle.com> Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/13513)
This commit is contained in:
parent
5658470ce7
commit
a07dc8167b
@ -79,8 +79,14 @@ static void twos_complement(unsigned char *dst, const unsigned char *src,
|
|||||||
unsigned int carry = pad & 1;
|
unsigned int carry = pad & 1;
|
||||||
|
|
||||||
/* Begin at the end of the encoding */
|
/* Begin at the end of the encoding */
|
||||||
dst += len;
|
if (len != 0) {
|
||||||
src += len;
|
/*
|
||||||
|
* if len == 0 then src/dst could be NULL, and this would be undefined
|
||||||
|
* behaviour.
|
||||||
|
*/
|
||||||
|
dst += len;
|
||||||
|
src += len;
|
||||||
|
}
|
||||||
/* two's complement value: ~value + 1 */
|
/* two's complement value: ~value + 1 */
|
||||||
while (len-- != 0) {
|
while (len-- != 0) {
|
||||||
*(--dst) = (unsigned char)(carry += *(--src) ^ pad);
|
*(--dst) = (unsigned char)(carry += *(--src) ^ pad);
|
||||||
|
@ -299,7 +299,7 @@ static long mem_ctrl(BIO *b, int cmd, long num, void *ptr)
|
|||||||
ret = (long)bm->length;
|
ret = (long)bm->length;
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
pptr = (char **)ptr;
|
pptr = (char **)ptr;
|
||||||
*pptr = (char *)&(bm->data[0]);
|
*pptr = (char *)(bm->data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BIO_C_SET_BUF_MEM:
|
case BIO_C_SET_BUF_MEM:
|
||||||
|
@ -917,18 +917,13 @@ err:
|
|||||||
int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
|
int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
|
||||||
unsigned char **data, long *len_out, unsigned int flags)
|
unsigned char **data, long *len_out, unsigned int flags)
|
||||||
{
|
{
|
||||||
EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
|
EVP_ENCODE_CTX *ctx = NULL;
|
||||||
const BIO_METHOD *bmeth;
|
const BIO_METHOD *bmeth;
|
||||||
BIO *headerB = NULL, *dataB = NULL;
|
BIO *headerB = NULL, *dataB = NULL;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
int len, taillen, headerlen, ret = 0;
|
int len, taillen, headerlen, ret = 0;
|
||||||
BUF_MEM * buf_mem;
|
BUF_MEM * buf_mem;
|
||||||
|
|
||||||
if (ctx == NULL) {
|
|
||||||
ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*len_out = 0;
|
*len_out = 0;
|
||||||
*name_out = *header = NULL;
|
*name_out = *header = NULL;
|
||||||
*data = NULL;
|
*data = NULL;
|
||||||
@ -951,9 +946,20 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
|
|||||||
if (!get_header_and_data(bp, &headerB, &dataB, name, flags))
|
if (!get_header_and_data(bp, &headerB, &dataB, name, flags))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
EVP_DecodeInit(ctx);
|
|
||||||
BIO_get_mem_ptr(dataB, &buf_mem);
|
BIO_get_mem_ptr(dataB, &buf_mem);
|
||||||
len = buf_mem->length;
|
len = buf_mem->length;
|
||||||
|
|
||||||
|
/* There was no data in the PEM file */
|
||||||
|
if (len == 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
ctx = EVP_ENCODE_CTX_new();
|
||||||
|
if (ctx == NULL) {
|
||||||
|
ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVP_DecodeInit(ctx);
|
||||||
if (EVP_DecodeUpdate(ctx, (unsigned char*)buf_mem->data, &len,
|
if (EVP_DecodeUpdate(ctx, (unsigned char*)buf_mem->data, &len,
|
||||||
(unsigned char*)buf_mem->data, len) < 0
|
(unsigned char*)buf_mem->data, len) < 0
|
||||||
|| EVP_DecodeFinal(ctx, (unsigned char*)&(buf_mem->data[len]),
|
|| EVP_DecodeFinal(ctx, (unsigned char*)&(buf_mem->data[len]),
|
||||||
@ -964,9 +970,6 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
|
|||||||
len += taillen;
|
len += taillen;
|
||||||
buf_mem->length = len;
|
buf_mem->length = len;
|
||||||
|
|
||||||
/* There was no data in the PEM file; avoid malloc(0). */
|
|
||||||
if (len == 0)
|
|
||||||
goto end;
|
|
||||||
headerlen = BIO_get_mem_data(headerB, NULL);
|
headerlen = BIO_get_mem_data(headerB, NULL);
|
||||||
*header = pem_malloc(headerlen + 1, flags);
|
*header = pem_malloc(headerlen + 1, flags);
|
||||||
*data = pem_malloc(len, flags);
|
*data = pem_malloc(len, flags);
|
||||||
|
@ -177,7 +177,8 @@ static int aes_ocb_block_update_internal(PROV_AES_OCB_CTX *ctx,
|
|||||||
}
|
}
|
||||||
*bufsz = 0;
|
*bufsz = 0;
|
||||||
outlint = AES_BLOCK_SIZE;
|
outlint = AES_BLOCK_SIZE;
|
||||||
out += AES_BLOCK_SIZE;
|
if (out != NULL)
|
||||||
|
out += AES_BLOCK_SIZE;
|
||||||
}
|
}
|
||||||
if (nextblocks > 0) {
|
if (nextblocks > 0) {
|
||||||
outlint += nextblocks;
|
outlint += nextblocks;
|
||||||
|
@ -167,7 +167,7 @@ int filter_provider_set_filter(int operation, const char *filterstr)
|
|||||||
if (globs->num_dispatch >= MAX_FILTERS)
|
if (globs->num_dispatch >= MAX_FILTERS)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
for (name = filterstrtmp; !last; name = sep + 1) {
|
for (name = filterstrtmp; !last; name = (sep == NULL ? NULL : sep + 1)) {
|
||||||
sep = strstr(name, ":");
|
sep = strstr(name, ":");
|
||||||
if (sep != NULL)
|
if (sep != NULL)
|
||||||
*sep = '\0';
|
*sep = '\0';
|
||||||
|
@ -108,8 +108,10 @@ static void test_fail_string_common(const char *prefix, const char *file,
|
|||||||
if (diff && i > 0)
|
if (diff && i > 0)
|
||||||
test_printf_stderr("%4s %s\n", "", bdiff);
|
test_printf_stderr("%4s %s\n", "", bdiff);
|
||||||
}
|
}
|
||||||
m1 += n1;
|
if (m1 != NULL)
|
||||||
m2 += n2;
|
m1 += n1;
|
||||||
|
if (m2 != NULL)
|
||||||
|
m2 += n2;
|
||||||
l1 -= n1;
|
l1 -= n1;
|
||||||
l2 -= n2;
|
l2 -= n2;
|
||||||
cnt += width;
|
cnt += width;
|
||||||
@ -497,8 +499,10 @@ static void test_fail_memory_common(const char *prefix, const char *file,
|
|||||||
if (diff && i > 0)
|
if (diff && i > 0)
|
||||||
test_printf_stderr("%4s %s\n", "", bdiff);
|
test_printf_stderr("%4s %s\n", "", bdiff);
|
||||||
}
|
}
|
||||||
m1 += n1;
|
if (m1 != NULL)
|
||||||
m2 += n2;
|
m1 += n1;
|
||||||
|
if (m2 != NULL)
|
||||||
|
m2 += n2;
|
||||||
l1 -= n1;
|
l1 -= n1;
|
||||||
l2 -= n2;
|
l2 -= n2;
|
||||||
cnt += bytes;
|
cnt += bytes;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user