@@ -1998,7 +1998,7 @@ PHP_FUNCTION(openssl_csr_get_public_key)
19981998}
19991999/* }}} */
20002000
2001- /* {{{ Returns an array of the fields/values of the Certificate Request */
2001+ /* Returns an array of the fields/values of the Certificate Request */
20022002PHP_FUNCTION (openssl_csr_parse )
20032003{
20042004 X509_REQ * csr = NULL ;
@@ -2007,6 +2007,8 @@ PHP_FUNCTION(openssl_csr_parse)
20072007 int i , sig_nid ;
20082008 bool useshortnames = 1 ;
20092009 zval subitem ;
2010+ zval critext ;
2011+ int critcount = 0 ;
20102012 X509_EXTENSION * extension ;
20112013 X509_NAME * subject_name ;
20122014 char * csr_name ;
@@ -2015,8 +2017,6 @@ PHP_FUNCTION(openssl_csr_parse)
20152017 BUF_MEM * bio_buf ;
20162018 char buf [256 ];
20172019 STACK_OF (X509_EXTENSION ) * exts = NULL ;
2018- char * crit_name = NULL ;
2019- int crit_len = 0 ;
20202020
20212021 ZEND_PARSE_PARAMETERS_START (1 , 2 )
20222022 Z_PARAM_OBJ_OF_CLASS_OR_STR (csr_obj , php_openssl_request_ce , csr_str )
@@ -2026,7 +2026,7 @@ PHP_FUNCTION(openssl_csr_parse)
20262026
20272027 csr = php_openssl_csr_from_param (csr_obj , csr_str , 1 );
20282028 if (csr == NULL ) {
2029- // TODO Add Warning?
2029+ php_error_docref ( NULL , E_WARNING , "First parameter must be a valid CSR" );
20302030 RETURN_FALSE ;
20312031 }
20322032 array_init (return_value );
@@ -2054,11 +2054,13 @@ PHP_FUNCTION(openssl_csr_parse)
20542054 add_assoc_long (return_value , "signatureTypeNID" , sig_nid );
20552055
20562056 array_init (& subitem );
2057+ array_init (& critext );
2058+
20572059 int attrcnt = X509_REQ_get_attr_count (csr );
20582060 if (attrcnt > 0 ) {
2061+ const char unknown [] = "Unknown" ;
20592062 for (i = 0 ; i < attrcnt ; i ++ ) {
20602063 X509_ATTRIBUTE * attr = X509_REQ_get_attr (csr ,i );
2061- char unknown [] = "Unknown" ;
20622064 if (attr ) {
20632065 char objbuf [80 ];
20642066 /* Adapted from openssl's "req" app */
@@ -2112,25 +2114,17 @@ PHP_FUNCTION(openssl_csr_parse)
21122114 extension = sk_X509_EXTENSION_value (exts , i );
21132115 nid = OBJ_obj2nid (X509_EXTENSION_get_object (extension ));
21142116 if (nid != NID_undef ) {
2115- extname = (char * )OBJ_nid2sn (OBJ_obj2nid ( X509_EXTENSION_get_object ( extension )) );
2117+ extname = (char * )OBJ_nid2sn (nid );
21162118 } else {
2117- OBJ_obj2txt (buf , sizeof (buf )- 1 , X509_EXTENSION_get_object (extension ), 1 );
2119+ if (OBJ_obj2txt (buf , sizeof (buf )- 1 , X509_EXTENSION_get_object (extension ), 1 ) < 0 ) {
2120+ php_openssl_store_errors ();
2121+ goto err_subitem ;
2122+ }
21182123 extname = buf ;
21192124 }
21202125 if (X509_EXTENSION_get_critical (extension )) {
2121- int new_len = strlen (extname ) + 10 ;
2122- if (new_len > crit_len ) {
2123- if (crit_name ) {
2124- efree (crit_name );
2125- }
2126- crit_len = new_len ;
2127- crit_name = emalloc (crit_len );
2128- }
2129- if (crit_name ) {
2130- strcpy (crit_name , extname );
2131- strcat (crit_name , ":critical" );
2132- add_assoc_bool (& subitem , crit_name , 1 );
2133- }
2126+ add_next_index_string (& critext , extname );
2127+ critcount ++ ;
21342128 }
21352129 bio_out = BIO_new (BIO_s_mem ());
21362130 if (bio_out == NULL ) {
@@ -2155,8 +2149,10 @@ PHP_FUNCTION(openssl_csr_parse)
21552149 BIO_free (bio_out );
21562150 }
21572151 add_assoc_zval (return_value , "extensions" , & subitem );
2158- if (crit_name ) {
2159- efree (crit_name );
2152+ if (critcount > 0 ) {
2153+ add_assoc_zval (return_value , "criticalExtensions" , & critext );
2154+ } else {
2155+ zval_ptr_dtor (& critext );
21602156 }
21612157 sk_X509_EXTENSION_pop_free (exts , X509_EXTENSION_free );
21622158 exts = NULL ;
@@ -2168,9 +2164,7 @@ PHP_FUNCTION(openssl_csr_parse)
21682164
21692165err_subitem :
21702166 zval_ptr_dtor (& subitem );
2171- if (crit_name ) {
2172- efree (crit_name );
2173- }
2167+ zval_ptr_dtor (& critext );
21742168 zend_array_destroy (Z_ARR_P (return_value ));
21752169 if (csr ) {
21762170 X509_REQ_free (csr );
@@ -2180,7 +2174,6 @@ PHP_FUNCTION(openssl_csr_parse)
21802174 }
21812175 RETURN_FALSE ;
21822176}
2183- /* }}} */
21842177
21852178/* }}} */
21862179
0 commit comments