Fix memleaks from #1755 and some pre-existing ones

This commit is contained in:
Leigh 2017-01-06 14:58:54 +00:00
parent ba0751a915
commit 053b966134

View File

@ -703,6 +703,8 @@ static void add_assoc_name_entry(zval * val, char * key, X509_NAME * name, int s
add_assoc_stringl(&subitem, sname, (char *)to_add, to_add_len); add_assoc_stringl(&subitem, sname, (char *)to_add, to_add_len);
} }
} }
OPENSSL_free(to_add);
} }
if (key != NULL) { if (key != NULL) {
zend_hash_str_update(Z_ARRVAL_P(val), key, strlen(key), &subitem); zend_hash_str_update(Z_ARRVAL_P(val), key, strlen(key), &subitem);
@ -2004,7 +2006,10 @@ PHP_FUNCTION(openssl_x509_parse)
char *extname; char *extname;
BIO *bio_out; BIO *bio_out;
BUF_MEM *bio_buf; BUF_MEM *bio_buf;
char * hexserial; ASN1_INTEGER *asn1_serial;
BIGNUM *bn_serial;
char *str_serial;
char *hex_serial;
char buf[256]; char buf[256];
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &zcert, &useshortnames) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &zcert, &useshortnames) == FAILURE) {
@ -2032,19 +2037,28 @@ PHP_FUNCTION(openssl_x509_parse)
add_assoc_name_entry(return_value, "issuer", X509_get_issuer_name(cert), useshortnames); add_assoc_name_entry(return_value, "issuer", X509_get_issuer_name(cert), useshortnames);
add_assoc_long(return_value, "version", X509_get_version(cert)); add_assoc_long(return_value, "version", X509_get_version(cert));
add_assoc_string(return_value, "serialNumber", i2s_ASN1_INTEGER(NULL, X509_get_serialNumber(cert))); asn1_serial = X509_get_serialNumber(cert);
/* Return the hex representation of the serial number, as defined by OpenSSL */ bn_serial = ASN1_INTEGER_to_BN(asn1_serial, NULL);
hexserial = BN_bn2hex(ASN1_INTEGER_to_BN(X509_get_serialNumber(cert), NULL)); /* Can return NULL on error or memory allocation failure */
if (!bn_serial) {
/* If we received null back from BN_bn2hex, there was a critical error in openssl,
* and we should not continue.
*/
if (!hexserial) {
RETURN_FALSE; RETURN_FALSE;
} }
add_assoc_string(return_value, "serialNumberHex", hexserial);
OPENSSL_free(hexserial); hex_serial = BN_bn2hex(bn_serial);
BN_free(bn_serial);
/* Can return NULL on error or memory allocation failure */
if (!hex_serial) {
RETURN_FALSE;
}
str_serial = i2s_ASN1_INTEGER(NULL, asn1_serial);
add_assoc_string(return_value, "serialNumber", str_serial);
OPENSSL_free(str_serial);
/* Return the hex representation of the serial number, as defined by OpenSSL */
add_assoc_string(return_value, "serialNumberHex", hex_serial);
OPENSSL_free(hex_serial);
add_assoc_asn1_string(return_value, "validFrom", X509_get_notBefore(cert)); add_assoc_asn1_string(return_value, "validFrom", X509_get_notBefore(cert));
add_assoc_asn1_string(return_value, "validTo", X509_get_notAfter(cert)); add_assoc_asn1_string(return_value, "validTo", X509_get_notAfter(cert));