@@ -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+ }
20792079get_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
21672169err_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