summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorJiasheng Jiang <jiasheng@iscas.ac.cn>2022-03-07 17:51:25 +0800
committerTomas Mraz <tomas@openssl.org>2022-03-14 09:57:12 +0100
commit2823e2e1d39479a7835d176862ec15e47a1bdecd (patch)
tree41e4b1aa06f612d18b7c0b96386b6c8f8407ac59 /crypto
parentad083f9b0ab81d094c2dbb8f5e2a5fb7738a0bfe (diff)
crypto/pem/pem_lib.c: Add check for BIO_read
As the potential failure of the BIO_read(), it should be better to add the check and return error if fails. Also, in order to decrease the same code, using 'out_free' will be better. Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/17754)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/pem/pem_lib.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c
index 3d7e2f36a5..681153593b 100644
--- a/crypto/pem/pem_lib.c
+++ b/crypto/pem/pem_lib.c
@@ -971,19 +971,22 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
headerlen = BIO_get_mem_data(headerB, NULL);
*header = pem_malloc(headerlen + 1, flags);
*data = pem_malloc(len, flags);
- if (*header == NULL || *data == NULL) {
- pem_free(*header, flags, 0);
- pem_free(*data, flags, 0);
- goto end;
- }
- BIO_read(headerB, *header, headerlen);
+ if (*header == NULL || *data == NULL)
+ goto out_free;
+ if (headerlen != 0 && BIO_read(headerB, *header, headerlen) != headerlen)
+ goto out_free;
(*header)[headerlen] = '\0';
- BIO_read(dataB, *data, len);
+ if (BIO_read(dataB, *data, len) != len)
+ goto out_free;
*len_out = len;
*name_out = name;
name = NULL;
ret = 1;
+ goto end;
+out_free:
+ pem_free(*header, flags, 0);
+ pem_free(*data, flags, 0);
end:
EVP_ENCODE_CTX_free(ctx);
pem_free(name, flags, 0);