Skip to content

Commit bfa3a44

Browse files
committed
Fix unfreed memory error
1 parent a1c9189 commit bfa3a44

File tree

1 file changed

+51
-46
lines changed

1 file changed

+51
-46
lines changed

ext/openssl/openssl.c

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,51 +2056,51 @@ PHP_FUNCTION(openssl_csr_parse)
20562056
array_init(&subitem);
20572057
int attrcnt = X509_REQ_get_attr_count(csr);
20582058
if (attrcnt > 0) {
2059-
for (i = 0; i < attrcnt; i++) {
2060-
X509_ATTRIBUTE *attr = X509_REQ_get_attr(csr,i);
2061-
char unknown[] = "Unknown";
2062-
if (attr) {
2063-
char objbuf[80];
2064-
/* Adapted from openssl's "req" app */
2065-
ASN1_TYPE *at;
2066-
ASN1_BIT_STRING *bs = NULL;
2067-
ASN1_OBJECT *aobj;
2068-
int j, type = 0, count = 1, ii = 0;
2069-
2070-
aobj = X509_ATTRIBUTE_get0_object(attr);
2071-
if (X509_REQ_extension_nid(OBJ_obj2nid(aobj)))
2072-
continue;
2073-
if ((j = i2t_ASN1_OBJECT(objbuf, sizeof(objbuf), aobj)) > 0) {
2074-
ii = 0;
2075-
count = X509_ATTRIBUTE_count(attr);
2076-
if (count == 0) {
2077-
RETURN_FALSE;
2078-
}
2059+
for (i = 0; i < attrcnt; i++) {
2060+
X509_ATTRIBUTE *attr = X509_REQ_get_attr(csr,i);
2061+
char unknown[] = "Unknown";
2062+
if (attr) {
2063+
char objbuf[80];
2064+
/* Adapted from openssl's "req" app */
2065+
ASN1_TYPE *at;
2066+
ASN1_BIT_STRING *bs = NULL;
2067+
ASN1_OBJECT *aobj;
2068+
int j, type = 0, count = 1, ii = 0;
2069+
2070+
aobj = X509_ATTRIBUTE_get0_object(attr);
2071+
if (X509_REQ_extension_nid(OBJ_obj2nid(aobj)))
2072+
continue;
2073+
if ((j = i2t_ASN1_OBJECT(objbuf, sizeof(objbuf), aobj)) > 0) {
2074+
ii = 0;
2075+
count = X509_ATTRIBUTE_count(attr);
2076+
if (count == 0) {
2077+
goto err_subitem;
2078+
}
20792079
get_next:
2080-
at = X509_ATTRIBUTE_get0_type(attr, ii);
2081-
type = at->type;
2082-
bs = at->value.asn1_string;
2083-
} else {
2084-
strcpy(objbuf, unknown);
2085-
}
2086-
switch (type) {
2087-
case V_ASN1_PRINTABLESTRING:
2088-
case V_ASN1_T61STRING:
2089-
case V_ASN1_NUMERICSTRING:
2090-
case V_ASN1_UTF8STRING:
2091-
case V_ASN1_IA5STRING:
2092-
add_assoc_stringl(&subitem, objbuf, (char *)bs->data, bs->length);
2093-
break;
2094-
default:
2095-
add_assoc_stringl(&subitem, objbuf, unknown, sizeof(unknown));
2096-
break;
2097-
}
2098-
if (++ii < count)
2099-
goto get_next;
2080+
at = X509_ATTRIBUTE_get0_type(attr, ii);
2081+
type = at->type;
2082+
bs = at->value.asn1_string;
2083+
} else {
2084+
strcpy(objbuf, unknown);
2085+
}
2086+
switch (type) {
2087+
case V_ASN1_PRINTABLESTRING:
2088+
case V_ASN1_T61STRING:
2089+
case V_ASN1_NUMERICSTRING:
2090+
case V_ASN1_UTF8STRING:
2091+
case V_ASN1_IA5STRING:
2092+
add_assoc_stringl(&subitem, objbuf, (char *)bs->data, bs->length);
2093+
break;
2094+
default:
2095+
add_assoc_stringl(&subitem, objbuf, unknown, sizeof(unknown));
2096+
break;
2097+
}
2098+
if (++ii < count)
2099+
goto get_next;
21002100

2101+
}
21012102
}
2102-
}
2103-
add_assoc_zval(return_value, "attributes", &subitem);
2103+
add_assoc_zval(return_value, "attributes", &subitem);
21042104
}
21052105

21062106
array_init(&subitem);
@@ -2156,22 +2156,27 @@ PHP_FUNCTION(openssl_csr_parse)
21562156
}
21572157
add_assoc_zval(return_value, "extensions", &subitem);
21582158
if (crit_name) {
2159-
efree(crit_name);
2159+
efree(crit_name);
21602160
}
2161+
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
2162+
exts = NULL;
21612163
}
21622164
if (csr) {
2163-
X509_REQ_free(csr);
2165+
X509_REQ_free(csr);
21642166
}
21652167
return;
21662168

21672169
err_subitem:
21682170
zval_ptr_dtor(&subitem);
21692171
if (crit_name) {
2170-
efree(crit_name);
2172+
efree(crit_name);
21712173
}
21722174
zend_array_destroy(Z_ARR_P(return_value));
21732175
if (csr) {
2174-
X509_REQ_free(csr);
2176+
X509_REQ_free(csr);
2177+
}
2178+
if (exts) {
2179+
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
21752180
}
21762181
RETURN_FALSE;
21772182
}

0 commit comments

Comments
 (0)