diff options
author | Jiasheng Jiang <jiasheng@iscas.ac.cn> | 2022-03-07 17:51:25 +0800 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2022-03-14 09:57:43 +0100 |
commit | c2b79e6f67b544cf928339c06dcae98662fe18c6 (patch) | |
tree | 8277c93a7f0f48f41ffd79d6950d15373a613c71 /crypto/pem | |
parent | aef0e2a12a33068906bed1699bcb32fdcdae47ec (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.c | 17 |
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); |