crypto/pem/pem_lib.c: Add check for BIO_read
authorJiasheng Jiang <jiasheng@iscas.ac.cn>
Mon, 7 Mar 2022 09:51:25 +0000 (17:51 +0800)
committerTomas Mraz <tomas@openssl.org>
Mon, 14 Mar 2022 08:57:43 +0000 (09:57 +0100)
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)

crypto/pem/pem_lib.c

index 3948021702fbb9efa8ec7abd9df34cc8b3918e83..bc88532a26879af301bcd6ef8fbddc95b6ebb4eb 100644 (file)
@@ -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);