@@ -2008,14 +2008,13 @@ static void phar_manifest_copy_ctor(zval *zv) /* {{{ */
20082008}
20092009/* }}} */
20102010
2011- static void phar_copy_cached_phar (phar_archive_data * * pphar ) /* {{{ */
2011+ static phar_archive_data * phar_copy_cached_phar (const phar_archive_data * persistent_phar ) /* {{{ */
20122012{
2013- phar_archive_data * phar ;
20142013 HashTable newmanifest ;
20152014 phar_archive_object * objphar ;
20162015
2017- phar = ( phar_archive_data * ) emalloc (sizeof (phar_archive_data ));
2018- * phar = * * pphar ;
2016+ phar_archive_data * phar = emalloc (sizeof (phar_archive_data ));
2017+ * phar = * persistent_phar ;
20192018 phar -> is_persistent = 0 ;
20202019 zend_string_addref (phar -> fname );
20212020
@@ -2029,47 +2028,40 @@ static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */
20292028
20302029 phar_metadata_tracker_clone (& phar -> metadata_tracker );
20312030
2032- zend_hash_init (& newmanifest , sizeof (phar_entry_info ),
2033- zend_get_hash_value , destroy_phar_manifest_entry , 0 );
2034- zend_hash_copy (& newmanifest , & (* pphar )-> manifest , phar_manifest_copy_ctor );
2031+ zend_hash_init (& newmanifest , sizeof (phar_entry_info ), NULL , destroy_phar_manifest_entry , 0 );
2032+ zend_hash_copy (& newmanifest , & persistent_phar -> manifest , phar_manifest_copy_ctor );
20352033 zend_hash_apply_with_argument (& newmanifest , phar_update_cached_entry , (void * )phar );
20362034 phar -> manifest = newmanifest ;
2037- zend_hash_init (& phar -> mounted_dirs , sizeof (char * ),
2038- zend_get_hash_value , NULL , 0 );
2039- zend_hash_init (& phar -> virtual_dirs , sizeof (char * ),
2040- zend_get_hash_value , NULL , 0 );
2041- zend_hash_copy (& phar -> virtual_dirs , & (* pphar )-> virtual_dirs , NULL );
2042- * pphar = phar ;
2035+ zend_hash_init (& phar -> mounted_dirs , sizeof (char * ), NULL , NULL , 0 );
2036+ zend_hash_init (& phar -> virtual_dirs , sizeof (char * ), NULL , NULL , 0 );
2037+ zend_hash_copy (& phar -> virtual_dirs , & persistent_phar -> virtual_dirs , NULL );
20432038
20442039 /* now, scan the list of persistent Phar objects referencing this phar and update the pointers */
20452040 ZEND_HASH_MAP_FOREACH_PTR (& PHAR_G (phar_persist_map ), objphar ) {
20462041 if (zend_string_equals (objphar -> archive -> fname , phar -> fname )) {
20472042 objphar -> archive = phar ;
20482043 }
20492044 } ZEND_HASH_FOREACH_END ();
2045+ return phar ;
20502046}
20512047/* }}} */
20522048
20532049zend_result phar_copy_on_write (phar_archive_data * * pphar ) /* {{{ */
20542050{
2055- zval zv , * pzv ;
2056- phar_archive_data * newpphar ;
2051+ phar_archive_data * newpphar = phar_copy_cached_phar (* pphar );
20572052
2058- ZVAL_PTR (& zv , * pphar );
2059- pzv = zend_hash_add (& (PHAR_G (phar_fname_map )), (* pphar )-> fname , & zv );
2053+ zval * pzv = zend_hash_add_ptr (& (PHAR_G (phar_fname_map )), newpphar -> fname , newpphar );
20602054 if (!pzv ) {
20612055 return FAILURE ;
20622056 }
20632057
2064- phar_copy_cached_phar ((phar_archive_data * * )& Z_PTR_P (pzv ));
2065- newpphar = Z_PTR_P (pzv );
20662058 /* invalidate phar cache */
20672059 PHAR_G (last_phar ) = NULL ;
20682060 PHAR_G (last_alias ) = NULL ;
20692061 PHAR_G (last_phar_name ) = NULL ;
20702062
20712063 if (newpphar -> alias_len && NULL == zend_hash_str_add_ptr (& (PHAR_G (phar_alias_map )), newpphar -> alias , newpphar -> alias_len , newpphar )) {
2072- zend_hash_del (& (PHAR_G (phar_fname_map )), ( * pphar ) -> fname );
2064+ zend_hash_del (& (PHAR_G (phar_fname_map )), newpphar -> fname );
20732065 return FAILURE ;
20742066 }
20752067
0 commit comments