Skip to content

Commit 5c96373

Browse files
committed
Fix memory leak in Phar::webPhar() on Windows
Closes phpGH-6574.
1 parent 6b631f0 commit 5c96373

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

ext/phar/phar_object.c

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ PHP_METHOD(Phar, webPhar)
609609
if (NULL == (z_script_name = zend_hash_str_find(_server, "SCRIPT_NAME", sizeof("SCRIPT_NAME")-1)) ||
610610
IS_STRING != Z_TYPE_P(z_script_name) ||
611611
!strstr(Z_STRVAL_P(z_script_name), basename)) {
612-
return;
612+
goto finish;
613613
}
614614

615615
if (NULL != (z_path_info = zend_hash_str_find(_server, "PATH_INFO", sizeof("PATH_INFO")-1)) &&
@@ -634,7 +634,7 @@ PHP_METHOD(Phar, webPhar)
634634
testit = sapi_getenv("SCRIPT_NAME", sizeof("SCRIPT_NAME")-1);
635635
if (!(pt = strstr(testit, basename))) {
636636
efree(testit);
637-
return;
637+
goto finish;
638638
}
639639

640640
path_info = sapi_getenv("PATH_INFO", sizeof("PATH_INFO")-1);
@@ -659,7 +659,7 @@ PHP_METHOD(Phar, webPhar)
659659

660660
if (!(pt = strstr(path_info, basename))) {
661661
/* this can happen with rewrite rules - and we have no idea what to do then, so return */
662-
return;
662+
goto finish;
663663
}
664664

665665
entry_len = strlen(path_info);
@@ -685,7 +685,7 @@ PHP_METHOD(Phar, webPhar)
685685
}
686686
efree(pt);
687687

688-
return;
688+
goto finish;
689689
}
690690

691691
fci.param_count = 1;
@@ -703,7 +703,7 @@ PHP_METHOD(Phar, webPhar)
703703
}
704704
efree(pt);
705705

706-
return;
706+
goto finish;
707707
}
708708

709709
if (Z_TYPE_P(fci.retval) == IS_UNDEF || Z_TYPE(retval) == IS_UNDEF) {
@@ -712,7 +712,7 @@ PHP_METHOD(Phar, webPhar)
712712
}
713713
zend_throw_exception_ex(phar_ce_PharException, 0, "phar error: rewrite callback must return a string or false");
714714
efree(pt);
715-
return;
715+
goto finish;
716716
}
717717

718718
switch (Z_TYPE(retval)) {
@@ -731,15 +731,15 @@ PHP_METHOD(Phar, webPhar)
731731
efree(pt);
732732

733733
zend_bailout();
734-
return;
734+
goto finish;
735735
default:
736736
if (free_pathinfo) {
737737
efree(path_info);
738738
}
739739
efree(pt);
740740

741741
zend_throw_exception_ex(phar_ce_PharException, 0, "phar error: rewrite callback must return a string or false");
742-
return;
742+
goto finish;
743743
}
744744
}
745745

@@ -812,9 +812,6 @@ PHP_METHOD(Phar, webPhar)
812812
if (FAILURE == phar_get_archive(&phar, fname, fname_len, NULL, 0, NULL) ||
813813
(info = phar_get_entry_info(phar, entry, entry_len, NULL, 0)) == NULL) {
814814
phar_do_404(phar, fname, fname_len, f404, f404_len, entry, entry_len);
815-
#ifdef PHP_WIN32
816-
efree(fname);
817-
#endif
818815
zend_bailout();
819816
}
820817

@@ -838,10 +835,8 @@ PHP_METHOD(Phar, webPhar)
838835
}
839836
efree(pt);
840837
efree(entry);
841-
#ifdef PHP_WIN32
842-
efree(fname);
843-
#endif
844-
RETURN_FALSE;
838+
RETVAL_FALSE;
839+
goto finish;
845840
}
846841
break;
847842
case IS_STRING:
@@ -855,10 +850,8 @@ PHP_METHOD(Phar, webPhar)
855850
}
856851
efree(pt);
857852
efree(entry);
858-
#ifdef PHP_WIN32
859-
efree(fname);
860-
#endif
861-
RETURN_FALSE;
853+
RETVAL_FALSE;
854+
goto finish;
862855
}
863856
}
864857
}
@@ -868,6 +861,11 @@ PHP_METHOD(Phar, webPhar)
868861
code = phar_file_type(&PHAR_G(mime_types), entry, &mime_type);
869862
}
870863
phar_file_action(phar, info, mime_type, code, entry, entry_len, fname, pt, ru, ru_len);
864+
865+
finish: ;
866+
#ifdef PHP_WIN32
867+
efree(fname);
868+
#endif
871869
}
872870
/* }}} */
873871

0 commit comments

Comments
 (0)