提交 2ca8bbe5 编写于 作者: B Bernd Edlinger

Use OPENSSL_secure_clear_free in PEM_read_bio_PrivateKey and PEM_read_bio_ex

Reviewed-by: NRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/4044)
上级 2928b29b
...@@ -220,10 +220,10 @@ static int check_pem(const char *nm, const char *name) ...@@ -220,10 +220,10 @@ static int check_pem(const char *nm, const char *name)
return 0; return 0;
} }
static void pem_free(void *p, unsigned int flags) static void pem_free(void *p, unsigned int flags, size_t num)
{ {
if (flags & PEM_FLAG_SECURE) if (flags & PEM_FLAG_SECURE)
OPENSSL_secure_free(p); OPENSSL_secure_clear_free(p, num);
else else
OPENSSL_free(p); OPENSSL_free(p);
} }
...@@ -242,13 +242,13 @@ static int pem_bytes_read_bio_flags(unsigned char **pdata, long *plen, ...@@ -242,13 +242,13 @@ static int pem_bytes_read_bio_flags(unsigned char **pdata, long *plen,
EVP_CIPHER_INFO cipher; EVP_CIPHER_INFO cipher;
char *nm = NULL, *header = NULL; char *nm = NULL, *header = NULL;
unsigned char *data = NULL; unsigned char *data = NULL;
long len; long len = 0;
int ret = 0; int ret = 0;
do { do {
pem_free(nm, flags); pem_free(nm, flags, 0);
pem_free(header, flags); pem_free(header, flags, 0);
pem_free(data, flags); pem_free(data, flags, len);
if (!PEM_read_bio_ex(bp, &nm, &header, &data, &len, flags)) { if (!PEM_read_bio_ex(bp, &nm, &header, &data, &len, flags)) {
if (ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE) if (ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE)
ERR_add_error_data(2, "Expecting: ", name); ERR_add_error_data(2, "Expecting: ", name);
...@@ -270,10 +270,10 @@ static int pem_bytes_read_bio_flags(unsigned char **pdata, long *plen, ...@@ -270,10 +270,10 @@ static int pem_bytes_read_bio_flags(unsigned char **pdata, long *plen,
err: err:
if (!ret || pnm == NULL) if (!ret || pnm == NULL)
pem_free(nm, flags); pem_free(nm, flags, 0);
pem_free(header, flags); pem_free(header, flags, 0);
if (!ret) if (!ret)
pem_free(data, flags); pem_free(data, flags, len);
return ret; return ret;
} }
...@@ -767,7 +767,7 @@ static int get_name(BIO *bp, char **name, unsigned int flags) ...@@ -767,7 +767,7 @@ static int get_name(BIO *bp, char **name, unsigned int flags)
ret = 1; ret = 1;
err: err:
pem_free(linebuf, flags); pem_free(linebuf, flags, LINESIZE + 1);
return ret; return ret;
} }
...@@ -875,7 +875,7 @@ static int get_header_and_data(BIO *bp, BIO **header, BIO **data, char *name, ...@@ -875,7 +875,7 @@ static int get_header_and_data(BIO *bp, BIO **header, BIO **data, char *name,
ret = 1; ret = 1;
err: err:
pem_free(linebuf, flags); pem_free(linebuf, flags, LINESIZE + 1);
return ret; return ret;
} }
...@@ -943,8 +943,8 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header, ...@@ -943,8 +943,8 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
*header = pem_malloc(headerlen + 1, flags); *header = pem_malloc(headerlen + 1, flags);
*data = pem_malloc(len, flags); *data = pem_malloc(len, flags);
if (*header == NULL || *data == NULL) { if (*header == NULL || *data == NULL) {
pem_free(*header, flags); pem_free(*header, flags, 0);
pem_free(*data, flags); pem_free(*data, flags, 0);
goto end; goto end;
} }
BIO_read(headerB, *header, headerlen); BIO_read(headerB, *header, headerlen);
...@@ -957,7 +957,7 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header, ...@@ -957,7 +957,7 @@ int PEM_read_bio_ex(BIO *bp, char **name_out, char **header,
end: end:
EVP_ENCODE_CTX_free(ctx); EVP_ENCODE_CTX_free(ctx);
pem_free(name, flags); pem_free(name, flags, 0);
BIO_free(headerB); BIO_free(headerB);
BIO_free(dataB); BIO_free(dataB);
return ret; return ret;
......
...@@ -88,7 +88,7 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, ...@@ -88,7 +88,7 @@ EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb,
PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY, ERR_R_ASN1_LIB); PEMerr(PEM_F_PEM_READ_BIO_PRIVATEKEY, ERR_R_ASN1_LIB);
err: err:
OPENSSL_secure_free(nm); OPENSSL_secure_free(nm);
OPENSSL_secure_free(data); OPENSSL_secure_clear_free(data, len);
return (ret); return (ret);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册