提交 8e588e28 编写于 作者: M Matt Caswell

Don't leak memory on error in i2b_PVK

The i2b_PVK function leaked a number of different memory allocations on
error paths (and even some non-error paths).
Reviewed-by: NRichard Levitte <levitte@openssl.org>
上级 204cf940
...@@ -807,26 +807,29 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel, ...@@ -807,26 +807,29 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel,
{ {
int outlen = 24, pklen; int outlen = 24, pklen;
unsigned char *p, *salt = NULL; unsigned char *p, *salt = NULL;
EVP_CIPHER_CTX *cctx = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX *cctx = NULL;
if (enclevel) if (enclevel)
outlen += PVK_SALTLEN; outlen += PVK_SALTLEN;
pklen = do_i2b(NULL, pk, 0); pklen = do_i2b(NULL, pk, 0);
if (pklen < 0) if (pklen < 0)
return -1; return -1;
outlen += pklen; outlen += pklen;
if (!out) if (out == NULL)
return outlen; return outlen;
if (*out) if (*out != NULL) {
p = *out; p = *out;
else { } else {
p = OPENSSL_malloc(outlen); p = OPENSSL_malloc(outlen);
if (p == NULL) { if (p == NULL) {
PEMerr(PEM_F_I2B_PVK, ERR_R_MALLOC_FAILURE); PEMerr(PEM_F_I2B_PVK, ERR_R_MALLOC_FAILURE);
return -1; return -1;
} }
*out = p;
} }
cctx = EVP_CIPHER_CTX_new();
if (cctx == NULL)
return -1;
write_ledword(&p, MS_PVKMAGIC); write_ledword(&p, MS_PVKMAGIC);
write_ledword(&p, 0); write_ledword(&p, 0);
if (EVP_PKEY_id(pk) == EVP_PKEY_DSA) if (EVP_PKEY_id(pk) == EVP_PKEY_DSA)
...@@ -843,9 +846,7 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel, ...@@ -843,9 +846,7 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel,
p += PVK_SALTLEN; p += PVK_SALTLEN;
} }
do_i2b(&p, pk, 0); do_i2b(&p, pk, 0);
if (enclevel == 0) if (enclevel != 0) {
return outlen;
else {
char psbuf[PEM_BUFSIZE]; char psbuf[PEM_BUFSIZE];
unsigned char keybuf[20]; unsigned char keybuf[20];
int enctmplen, inlen; int enctmplen, inlen;
...@@ -871,7 +872,12 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel, ...@@ -871,7 +872,12 @@ static int i2b_PVK(unsigned char **out, EVP_PKEY *pk, int enclevel,
if (!EVP_DecryptFinal_ex(cctx, p + enctmplen, &enctmplen)) if (!EVP_DecryptFinal_ex(cctx, p + enctmplen, &enctmplen))
goto error; goto error;
} }
EVP_CIPHER_CTX_free(cctx); EVP_CIPHER_CTX_free(cctx);
if (*out == NULL)
*out = p;
return outlen; return outlen;
error: error:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册