File tree Expand file tree Collapse file tree 4 files changed +64
-10
lines changed Expand file tree Collapse file tree 4 files changed +64
-10
lines changed Original file line number Diff line number Diff line change @@ -2153,15 +2153,15 @@ PHP_FUNCTION(openssl_x509_parse)
21532153	/* Can return NULL on error or memory allocation failure */ 
21542154	if  (!bn_serial ) {
21552155		php_openssl_store_errors ();
2156- 		RETURN_FALSE ;
2156+ 		goto  err ;
21572157	}
21582158
21592159	hex_serial  =  BN_bn2hex (bn_serial );
21602160	BN_free (bn_serial );
21612161	/* Can return NULL on error or memory allocation failure */ 
21622162	if  (!hex_serial ) {
21632163		php_openssl_store_errors ();
2164- 		RETURN_FALSE ;
2164+ 		goto  err ;
21652165	}
21662166
21672167	str_serial  =  i2s_ASN1_INTEGER (NULL , asn1_serial );
@@ -2233,19 +2233,15 @@ PHP_FUNCTION(openssl_x509_parse)
22332233		bio_out  =  BIO_new (BIO_s_mem ());
22342234		if  (bio_out  ==  NULL ) {
22352235			php_openssl_store_errors ();
2236- 			RETURN_FALSE ;
2236+ 			goto  err_subitem ;
22372237		}
22382238		if  (nid  ==  NID_subject_alt_name ) {
22392239			if  (openssl_x509v3_subjectAltName (bio_out , extension ) ==  0 ) {
22402240				BIO_get_mem_ptr (bio_out , & bio_buf );
22412241				add_assoc_stringl (& subitem , extname , bio_buf -> data , bio_buf -> length );
22422242			} else  {
2243- 				zend_array_destroy (Z_ARR_P (return_value ));
22442243				BIO_free (bio_out );
2245- 				if  (cert_str ) {
2246- 					X509_free (cert );
2247- 				}
2248- 				RETURN_FALSE ;
2244+ 				goto err_subitem ;
22492245			}
22502246		}
22512247		else  if  (X509V3_EXT_print (bio_out , extension , 0 , 0 )) {
@@ -2260,6 +2256,16 @@ PHP_FUNCTION(openssl_x509_parse)
22602256	if  (cert_str ) {
22612257		X509_free (cert );
22622258	}
2259+ 	return ;
2260+ 
2261+ err_subitem :
2262+ 	zval_ptr_dtor (& subitem );
2263+ err :
2264+ 	zend_array_destroy (Z_ARR_P (return_value ));
2265+ 	if  (cert_str ) {
2266+ 		X509_free (cert );
2267+ 	}
2268+ 	RETURN_FALSE ;
22632269}
22642270/* }}} */ 
22652271
Original file line number Diff line number Diff line change @@ -291,8 +291,13 @@ PHPAPI zend_result php_session_reset_id(void);
291291	zend_ulong num_key;													\
292292	zval *struc;
293293
294+ /* Do not use a return statement in `code` because that may leak memory. 
295+  * Break out of the loop instead. */ 
294296#define  PS_ENCODE_LOOP (code ) do {									\
295- 	HashTable *_ht = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars)));	\
297+ 	zval _zv;														\
298+ 	/* protect against user interference */ 							\
299+ 	ZVAL_COPY (& _zv , Z_REFVAL (PS (http_session_vars )));				\
300+ 	HashTable  * _ht  =  Z_ARRVAL (_zv );									\
296301	ZEND_HASH_FOREACH_KEY (_ht , num_key , key ) {						\
297302		if  (key  ==  NULL ) {											\
298303			php_error_docref (NULL , E_WARNING ,						\
@@ -303,6 +308,7 @@ PHPAPI zend_result php_session_reset_id(void);
303308			code ;		 											\
304309		} 															\
305310	} ZEND_HASH_FOREACH_END ();										\
311+ 	zval_ptr_dtor (& _zv );											\
306312} while (0 )
307313
308314PHPAPI  ZEND_EXTERN_MODULE_GLOBALS (ps )
Original file line number Diff line number Diff line change @@ -1079,6 +1079,7 @@ PS_SERIALIZER_ENCODE_FUNC(php) /* {{{ */
10791079{
10801080	smart_str  buf  =  {0 };
10811081	php_serialize_data_t  var_hash ;
1082+ 	bool  fail  =  false;
10821083	PS_ENCODE_VARS ;
10831084
10841085	PHP_VAR_SERIALIZE_INIT (var_hash );
@@ -1088,12 +1089,17 @@ PS_SERIALIZER_ENCODE_FUNC(php) /* {{{ */
10881089		if  (memchr (ZSTR_VAL (key ), PS_DELIMITER , ZSTR_LEN (key ))) {
10891090			PHP_VAR_SERIALIZE_DESTROY (var_hash );
10901091			smart_str_free (& buf );
1091- 			return  NULL ;
1092+ 			fail  =  true;
1093+ 			break ;
10921094		}
10931095		smart_str_appendc (& buf , PS_DELIMITER );
10941096		php_var_serialize (& buf , struc , & var_hash );
10951097	);
10961098
1099+ 	if  (fail ) {
1100+ 		return  NULL ;
1101+ 	}
1102+ 
10971103	smart_str_0 (& buf );
10981104
10991105	PHP_VAR_SERIALIZE_DESTROY (var_hash );
Original file line number Diff line number Diff line change 1+ --TEST--
2+ GH-16590 (UAF in session_encode())
3+ --EXTENSIONS--
4+ session
5+ --SKIPIF--
6+ <?php  include ('skipif.inc ' ); ?> 
7+ --INI--
8+ session.use_cookies=0
9+ session.cache_limiter=
10+ session.serialize_handler=php
11+ session.save_handler=files
12+ --FILE--
13+ <?php 
14+ 
15+ class  C {
16+     function  __serialize () {
17+         $ _SESSION   = [];
18+         return  [];
19+     }
20+ }
21+ 
22+ session_start ();
23+ 
24+ $ _SESSION  ['Lz ' ] = new  C ;
25+ for  ($ i  = 0 ; $ i  < 2 ; $ i ++) {
26+     $ _SESSION  [$ i ] = $ i ;
27+ }
28+ 
29+ var_dump (session_encode ());
30+ 
31+ ?> 
32+ --EXPECTF--
33+ Warning: session_encode(): Skipping numeric key 0 in %s on line %d
34+ 
35+ Warning: session_encode(): Skipping numeric key 1 in %s on line %d
36+ string(15) "Lz|O:1:"C":0:{}"
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments