@@ -699,6 +699,7 @@ PHP_METHOD(Phar, webPhar)
699699 zval params , retval ;
700700
701701 ZVAL_STRINGL (& params , entry , entry_len );
702+ efree (entry );
702703
703704 rewrite_fci .param_count = 1 ;
704705 rewrite_fci .params = & params ;
@@ -716,9 +717,10 @@ PHP_METHOD(Phar, webPhar)
716717
717718 switch (Z_TYPE (retval )) {
718719 case IS_STRING :
719- efree ( entry );
720+ /* TODO: avoid relocation??? */
720721 entry = estrndup (Z_STRVAL_P (rewrite_fci .retval ), Z_STRLEN_P (rewrite_fci .retval ));
721722 entry_len = Z_STRLEN_P (rewrite_fci .retval );
723+ zval_ptr_dtor_str (& retval );
722724 break ;
723725 case IS_TRUE :
724726 case IS_FALSE :
@@ -729,15 +731,16 @@ PHP_METHOD(Phar, webPhar)
729731 }
730732 efree (pt );
731733
732- zend_bailout ();
734+ zend_throw_unwind_exit ();
735+ return ;
733736 default :
737+ zval_ptr_dtor (& retval );
734738 zend_throw_exception_ex (phar_ce_PharException , 0 , "phar error: rewrite callback must return a string or false" );
735739
736740cleanup_fail :
737741 if (free_pathinfo ) {
738742 efree (path_info );
739743 }
740- efree (entry );
741744 efree (pt );
742745#ifdef PHP_WIN32
743746 efree (fname );
@@ -752,29 +755,28 @@ PHP_METHOD(Phar, webPhar)
752755
753756 if (!entry_len || (entry_len == 1 && entry [0 ] == '/' )) {
754757 efree (entry );
758+ efree (pt );
759+
760+ bool is_entry_allocated = false;
761+
755762 /* direct request */
756763 if (index_php_len ) {
757764 entry = index_php ;
758765 entry_len = index_php_len ;
759766 if (entry [0 ] != '/' ) {
760767 spprintf (& entry , 0 , "/%s" , index_php );
761768 ++ entry_len ;
769+ is_entry_allocated = true;
762770 }
763771 } else {
764772 /* assume "index.php" is starting point */
765- entry = estrndup ( "/index.php" , sizeof ( "/index.php" )) ;
773+ entry = "/index.php" ;
766774 entry_len = sizeof ("/index.php" )- 1 ;
767775 }
768776
769777 if (FAILURE == phar_get_archive (& phar , fname , fname_len , NULL , 0 , NULL ) ||
770778 (info = phar_get_entry_info (phar , entry , entry_len , NULL , false)) == NULL ) {
771779 phar_do_404 (phar , fname , fname_len , f404 );
772-
773- if (free_pathinfo ) {
774- efree (path_info );
775- }
776-
777- zend_bailout ();
778780 } else {
779781 char * tmp = NULL , sa = '\0' ;
780782 sapi_header_line ctr = {0 };
@@ -801,21 +803,32 @@ PHP_METHOD(Phar, webPhar)
801803 * tmp = sa ;
802804 }
803805
804- if (free_pathinfo ) {
805- efree (path_info );
806- }
807-
808806 sapi_header_op (SAPI_HEADER_REPLACE , & ctr );
809807 sapi_send_headers ();
810808 efree ((void * ) ctr .line );
811- zend_bailout ();
812809 }
810+
811+ if (is_entry_allocated ) {
812+ efree (entry );
813+ }
814+ if (free_pathinfo ) {
815+ efree (path_info );
816+ }
817+
818+ zend_throw_unwind_exit ();
819+ return ;
813820 }
814821
815822 if (FAILURE == phar_get_archive (& phar , fname , fname_len , NULL , 0 , NULL ) ||
816823 (info = phar_get_entry_info (phar , entry , entry_len , NULL , false)) == NULL ) {
824+ efree (entry );
825+ efree (pt );
826+ if (free_pathinfo ) {
827+ efree (path_info );
828+ }
817829 phar_do_404 (phar , fname , fname_len , f404 );
818- zend_bailout ();
830+ zend_throw_unwind_exit ();
831+ return ;
819832 }
820833
821834 if (mimeoverride && zend_hash_num_elements (Z_ARRVAL_P (mimeoverride ))) {
0 commit comments