Fix #66942: openssl_seal() memory leak

Fix #66952: memory leak in openssl_open()
This commit is contained in:
Chuan Ma 2014-03-24 23:24:41 -04:00 committed by Stanislav Malyshev
parent 99b01fb3d7
commit f413a77b3d

View File

@ -4865,6 +4865,7 @@ PHP_FUNCTION(openssl_seal)
if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) { if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) {
RETVAL_FALSE; RETVAL_FALSE;
EVP_CIPHER_CTX_cleanup(&ctx);
goto clean_exit; goto clean_exit;
} }
@ -4875,10 +4876,12 @@ PHP_FUNCTION(openssl_seal)
#endif #endif
/* allocate one byte extra to make room for \0 */ /* allocate one byte extra to make room for \0 */
buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx)); buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx));
EVP_CIPHER_CTX_cleanup(&ctx);
if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
RETVAL_FALSE; RETVAL_FALSE;
efree(buf); efree(buf);
EVP_CIPHER_CTX_cleanup(&ctx);
goto clean_exit; goto clean_exit;
} }
@ -4911,6 +4914,7 @@ PHP_FUNCTION(openssl_seal)
efree(buf); efree(buf);
} }
RETVAL_LONG(len1 + len2); RETVAL_LONG(len1 + len2);
EVP_CIPHER_CTX_cleanup(&ctx);
clean_exit: clean_exit:
for (i=0; i<nkeys; i++) { for (i=0; i<nkeys; i++) {
@ -4969,25 +4973,21 @@ PHP_FUNCTION(openssl_open)
if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) {
if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) { if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) {
efree(buf); efree(buf);
if (keyresource == -1) { RETVAL_FALSE;
EVP_PKEY_free(pkey); } else {
} zval_dtor(opendata);
RETURN_FALSE; buf[len1 + len2] = '\0';
ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
RETVAL_TRUE;
} }
} else { } else {
efree(buf); efree(buf);
if (keyresource == -1) { RETVAL_FALSE;
EVP_PKEY_free(pkey);
}
RETURN_FALSE;
} }
if (keyresource == -1) { if (keyresource == -1) {
EVP_PKEY_free(pkey); EVP_PKEY_free(pkey);
} }
zval_dtor(opendata); EVP_CIPHER_CTX_cleanup(&ctx);
buf[len1 + len2] = '\0';
ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0);
RETURN_TRUE;
} }
/* }}} */ /* }}} */