@@ -38,8 +38,8 @@ PHP_FUNCTION(phar_opendir) /* {{{ */
3838 }
3939
4040 if (!IS_ABSOLUTE_PATH (filename , filename_len ) && !strstr (filename , "://" )) {
41- char * arch , * entry ;
42- size_t arch_len , entry_len ;
41+ char * arch ;
42+ size_t arch_len ;
4343 zend_string * fname = zend_get_executed_filename_ex ();
4444
4545 /* we are checking for existence of a file within the relative path. Chances are good that this is
@@ -53,18 +53,16 @@ PHP_FUNCTION(phar_opendir) /* {{{ */
5353 php_stream * stream ;
5454 char * name ;
5555
56- entry = estrndup (filename , filename_len );
5756 /* fopen within phar, if :// is not in the url, then prepend phar://<archive>/ */
58- entry_len = filename_len ;
5957 /* retrieving a file within the current directory, so use this if possible */
60- entry = phar_fix_filepath (entry , & entry_len , true);
58+ zend_string * entry = phar_fix_filepath (filename , filename_len , true);
6159
62- if (entry [0 ] == '/' ) {
63- spprintf (& name , 4096 , "phar://%s%s" , arch , entry );
60+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
61+ spprintf (& name , 4096 , "phar://%s%s" , arch , ZSTR_VAL ( entry ) );
6462 } else {
65- spprintf (& name , 4096 , "phar://%s/%s" , arch , entry );
63+ spprintf (& name , 4096 , "phar://%s/%s" , arch , ZSTR_VAL ( entry ) );
6664 }
67- efree (entry );
65+ zend_string_release_ex (entry , false );
6866 efree (arch );
6967 if (zcontext ) {
7068 context = php_stream_context_from_zval (zcontext , 0 );
@@ -116,32 +114,31 @@ static zend_string* phar_get_name_for_relative_paths(zend_string *filename, bool
116114 return NULL ;
117115 }
118116 } else {
119- size_t entry_len = ZSTR_LEN (filename );
120- char * entry = phar_fix_filepath (estrndup (ZSTR_VAL (filename ), ZSTR_LEN (filename )), & entry_len , true);
117+ zend_string * entry = phar_fix_filepath (ZSTR_VAL (filename ), ZSTR_LEN (filename ), true);
121118 bool is_in_phar ;
122- if (entry [0 ] == '/' ) {
123- is_in_phar = zend_hash_str_exists (& (phar -> manifest ), entry + 1 , entry_len - 1 );
119+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
120+ is_in_phar = zend_hash_str_exists (& (phar -> manifest ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 );
124121 } else {
125- is_in_phar = zend_hash_str_exists (& (phar -> manifest ), entry , entry_len );
122+ is_in_phar = zend_hash_exists (& (phar -> manifest ), entry );
126123 }
127124 /* this file is not in the phar, use the original path */
128125 if (!is_in_phar ) {
129- efree (entry );
126+ zend_string_release_ex (entry , false );
130127 efree (arch );
131128 return NULL ;
132129 }
133130 /* auto-convert to phar:// */
134- if (entry [0 ] == '/' ) {
135- ZEND_ASSERT (strlen ("phar://" ) + arch_len + entry_len < 4096 );
131+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
132+ ZEND_ASSERT (strlen ("phar://" ) + arch_len + ZSTR_LEN ( entry ) < 4096 );
136133 name = zend_string_concat3 (
137134 "phar://" , strlen ("phar://" ),
138135 arch , arch_len ,
139- entry , entry_len
136+ ZSTR_VAL ( entry ), ZSTR_LEN ( entry )
140137 );
141138 } else {
142- name = strpprintf (4096 , "phar://%s/%s" , arch , entry );
139+ name = strpprintf (4096 , "phar://%s/%s" , arch , ZSTR_VAL ( entry ) );
143140 }
144- efree (entry );
141+ zend_string_release_ex (entry , false );
145142 }
146143
147144 efree (arch );
@@ -478,8 +475,8 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
478475 }
479476
480477 if (!IS_ABSOLUTE_PATH (filename , filename_length ) && !strstr (filename , "://" )) {
481- char * arch , * entry ;
482- size_t arch_len , entry_len ;
478+ char * arch ;
479+ size_t arch_len ;
483480 zend_string * fname ;
484481 zend_stat_t sb = {0 };
485482 phar_archive_data * phar ;
@@ -495,39 +492,34 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
495492 if (PHAR_G (last_phar ) && ZSTR_LEN (fname ) - 7 >= PHAR_G (last_phar_name_len ) && !memcmp (ZSTR_VAL (fname ) + 7 , PHAR_G (last_phar_name ), PHAR_G (last_phar_name_len ))) {
496493 arch = estrndup (PHAR_G (last_phar_name ), PHAR_G (last_phar_name_len ));
497494 arch_len = PHAR_G (last_phar_name_len );
498- entry = estrndup (filename , filename_length );
499495 /* fopen within phar, if :// is not in the url, then prepend phar://<archive>/ */
500- entry_len = filename_length ;
501496 phar = PHAR_G (last_phar );
502497 goto splitted ;
503498 }
504499 if (SUCCESS == phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), & arch , & arch_len , NULL , NULL , 2 , 0 )) {
505- entry = estrndup (filename , filename_length );
506500 /* fopen within phar, if :// is not in the url, then prepend phar://<archive>/ */
507- entry_len = filename_length ;
508501 if (FAILURE == phar_get_archive (& phar , arch , arch_len , NULL , 0 , NULL )) {
509502 efree (arch );
510- efree (entry );
511503 goto skip_phar ;
512504 }
513505splitted :
514- entry = phar_fix_filepath (entry , & entry_len , true);
506+ zend_string * entry = phar_fix_filepath (filename , filename_length , true);
515507 const phar_entry_info * data = NULL ;
516- if (entry [0 ] == '/' ) {
517- data = zend_hash_str_find_ptr (& (phar -> manifest ), entry + 1 , entry_len - 1 );
508+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
509+ data = zend_hash_str_find_ptr (& (phar -> manifest ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 );
518510 if (data ) {
519- efree (entry );
511+ zend_string_release_ex (entry , false );
520512 goto stat_entry ;
521513 }
522514 goto notfound ;
523515 }
524- data = zend_hash_str_find_ptr (& (phar -> manifest ), entry , entry_len );
516+ data = zend_hash_find_ptr (& (phar -> manifest ), entry );
525517 if (data ) {
526- efree (entry );
518+ zend_string_release_ex (entry , false );
527519 goto stat_entry ;
528520 }
529- if (zend_hash_str_exists (& (phar -> virtual_dirs ), entry , entry_len )) {
530- efree (entry );
521+ if (zend_hash_exists (& (phar -> virtual_dirs ), entry )) {
522+ zend_string_release_ex (entry , false );
531523 efree (arch );
532524 if (IS_EXISTS_CHECK (type )) {
533525 RETURN_TRUE ;
@@ -544,31 +536,29 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
544536 size_t save_len ;
545537
546538notfound :
547- efree (entry );
539+ zend_string_release_ex (entry , false );
548540 save = PHAR_G (cwd );
549541 save_len = PHAR_G (cwd_len );
550542 /* this file is not in the current directory, use the original path */
551- entry = estrndup (filename , filename_length );
552- entry_len = filename_length ;
553543 PHAR_G (cwd ) = "/" ;
554544 PHAR_G (cwd_len ) = 0 ;
555545 /* clean path without cwd */
556- entry = phar_fix_filepath (entry , & entry_len , true);
557- data = zend_hash_str_find_ptr (& (phar -> manifest ), entry + 1 , entry_len - 1 );
546+ entry = phar_fix_filepath (filename , filename_length , true);
547+ data = zend_hash_str_find_ptr (& (phar -> manifest ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 );
558548 if (data ) {
559549 PHAR_G (cwd ) = save ;
560550 PHAR_G (cwd_len ) = save_len ;
561- efree (entry );
551+ zend_string_release_ex (entry , false );
562552 if (IS_EXISTS_CHECK (type )) {
563553 efree (arch );
564554 RETURN_TRUE ;
565555 }
566556 goto stat_entry ;
567557 }
568- if (zend_hash_str_exists (& (phar -> virtual_dirs ), entry + 1 , entry_len - 1 )) {
558+ if (zend_hash_str_exists (& (phar -> virtual_dirs ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 )) {
569559 PHAR_G (cwd ) = save ;
570560 PHAR_G (cwd_len ) = save_len ;
571- efree (entry );
561+ zend_string_release_ex (entry , false );
572562 efree (arch );
573563 if (IS_EXISTS_CHECK (type )) {
574564 RETURN_TRUE ;
@@ -583,7 +573,7 @@ static void phar_file_stat(const char *filename, size_t filename_length, int typ
583573 }
584574 PHAR_G (cwd ) = save ;
585575 PHAR_G (cwd_len ) = save_len ;
586- efree (entry );
576+ zend_string_release_ex (entry , false );
587577 efree (arch );
588578 /* Error Occurred */
589579 if (!IS_EXISTS_CHECK (type )) {
@@ -737,8 +727,8 @@ PHP_FUNCTION(phar_is_file) /* {{{ */
737727 goto skip_phar ;
738728 }
739729 if (!IS_ABSOLUTE_PATH (filename , filename_len ) && !strstr (filename , "://" )) {
740- char * arch , * entry ;
741- size_t arch_len , entry_len ;
730+ char * arch ;
731+ size_t arch_len ;
742732 zend_string * fname = zend_get_executed_filename_ex ();
743733
744734 /* we are checking for existence of a file within the relative path. Chances are good that this is
@@ -750,29 +740,24 @@ PHP_FUNCTION(phar_is_file) /* {{{ */
750740 if (SUCCESS == phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), & arch , & arch_len , NULL , NULL , 2 , 0 )) {
751741 phar_archive_data * phar ;
752742
753- entry = filename ;
754743 /* fopen within phar, if :// is not in the url, then prepend phar://<archive>/ */
755- entry_len = filename_len ;
756744 /* retrieving a file within the current directory, so use this if possible */
757745 if (SUCCESS == phar_get_archive (& phar , arch , arch_len , NULL , 0 , NULL )) {
758746 phar_entry_info * etemp ;
759747
760- entry = phar_fix_filepath (estrndup ( entry , entry_len ), & entry_len , true);
761- if (entry [0 ] == '/' ) {
762- etemp = zend_hash_str_find_ptr (& (phar -> manifest ), entry + 1 , entry_len - 1 );
748+ zend_string * entry = phar_fix_filepath (filename , filename_len , true);
749+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
750+ etemp = zend_hash_str_find_ptr (& (phar -> manifest ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 );
763751 } else {
764- etemp = zend_hash_str_find_ptr (& (phar -> manifest ), entry , entry_len );
752+ etemp = zend_hash_find_ptr (& (phar -> manifest ), entry );
765753 }
754+ zend_string_release_ex (entry , false);
766755 if (etemp ) {
767- efree (entry );
768756 efree (arch );
769757 RETURN_BOOL (!etemp -> is_dir );
770758 }
771759 /* this file is not in the current directory, use the original path */
772760 }
773- if (entry != filename ) {
774- efree (entry );
775- }
776761 efree (arch );
777762 RETURN_FALSE ;
778763 }
@@ -801,7 +786,7 @@ PHP_FUNCTION(phar_is_link) /* {{{ */
801786 }
802787 if (!IS_ABSOLUTE_PATH (filename , filename_len ) && !strstr (filename , "://" )) {
803788 char * arch ;
804- size_t arch_len , entry_len ;
789+ size_t arch_len ;
805790 zend_string * fname = zend_get_executed_filename_ex ();
806791
807792 /* we are checking for existence of a file within the relative path. Chances are good that this is
@@ -813,20 +798,18 @@ PHP_FUNCTION(phar_is_link) /* {{{ */
813798 if (SUCCESS == phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), & arch , & arch_len , NULL , NULL , 2 , 0 )) {
814799 phar_archive_data * phar ;
815800
816- char * entry = filename ;
817801 /* fopen within phar, if :// is not in the url, then prepend phar://<archive>/ */
818- entry_len = filename_len ;
819802 /* retrieving a file within the current directory, so use this if possible */
820803 if (SUCCESS == phar_get_archive (& phar , arch , arch_len , NULL , 0 , NULL )) {
821804 phar_entry_info * etemp ;
822805
823- entry = phar_fix_filepath (estrndup ( entry , entry_len ), & entry_len , true);
824- if (entry [0 ] == '/' ) {
825- etemp = zend_hash_str_find_ptr (& (phar -> manifest ), entry + 1 , entry_len - 1 );
806+ zend_string * entry = phar_fix_filepath (filename , filename_len , true);
807+ if (ZSTR_VAL ( entry ) [0 ] == '/' ) {
808+ etemp = zend_hash_str_find_ptr (& (phar -> manifest ), ZSTR_VAL ( entry ) + 1 , ZSTR_LEN ( entry ) - 1 );
826809 } else {
827- etemp = zend_hash_str_find_ptr (& (phar -> manifest ), entry , entry_len );
810+ etemp = zend_hash_find_ptr (& (phar -> manifest ), entry );
828811 }
829- efree (entry );
812+ zend_string_release_ex (entry , false );
830813 if (etemp ) {
831814 efree (arch );
832815 RETURN_BOOL (etemp -> link );
0 commit comments