summaryrefslogtreecommitdiffstats
path: root/crypto/pem
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:43 +0100
commitc2b79e6f67b544cf928339c06dcae98662fe18c6 (patch)
tree8277c93a7f0f48f41ffd79d6950d15373a613c71 /crypto/pem
parentaef0e2a12a33068906bed1699bcb32fdcdae47ec (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) (cherry picked from commit 2823e2e1d39479a7835d176862ec15e47a1bdecd)
Diffstat (limited to 'crypto/pem')
-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 3948021702..bc88532a26 100644
--- a/crypto/pem/pem_lib.c
+++ b/crypto/pem/pem_lib.c
@@ -974,19 +974,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);