From: Greg Beaver Date: Sat, 22 Mar 2008 22:56:04 +0000 (+0000) Subject: fix Bug #13110: using rewrite parameter to webPhar causes memory error X-Git-Tag: RELEASE_2_0_0a1~34 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15f8facdede64492b042f0895ec53daeaea8086b;p=php fix Bug #13110: using rewrite parameter to webPhar causes memory error --- diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 2ef163b965..38ea938c84 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -92,13 +92,15 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char zval *temp; char newname[] = "PHAR_PATH_INFO"; - path_info = Z_STRVAL_PP(stuff); - code = Z_STRLEN_PP(stuff); - ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + entry_len, Z_STRLEN_PP(stuff) - entry_len - request_uri_len, 1); + path_info = Z_STRVAL_PP(stuff); + code = Z_STRLEN_PP(stuff); + if (Z_STRLEN_PP(stuff) > entry_len && !memcmp(Z_STRVAL_PP(stuff), entry, entry_len)) { + ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + entry_len, Z_STRLEN_PP(stuff) - entry_len - request_uri_len, 1); - MAKE_STD_ZVAL(temp); - ZVAL_STRINGL(temp, path_info, code, 0); - zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + MAKE_STD_ZVAL(temp); + ZVAL_STRINGL(temp, path_info, code, 0); + zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + } } if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff)) { int code; @@ -124,11 +126,13 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); - ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, Z_STRLEN_PP(stuff) - basename_len, 1); + if (Z_STRLEN_PP(stuff) > basename_len && !memcmp(Z_STRVAL_PP(stuff), basename, basename_len)) { + ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, Z_STRLEN_PP(stuff) - basename_len, 1); - MAKE_STD_ZVAL(temp); - ZVAL_STRINGL(temp, path_info, code, 0); - zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + MAKE_STD_ZVAL(temp); + ZVAL_STRINGL(temp, path_info, code, 0); + zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + } } } if (zend_hash_exists(&(PHAR_GLOBALS->phar_SERVER_mung_list), "PHP_SELF", sizeof("PHP_SELF")-1)) { @@ -139,11 +143,13 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); - ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, Z_STRLEN_PP(stuff) - basename_len, 1); + if (Z_STRLEN_PP(stuff) > basename_len && !memcmp(Z_STRVAL_PP(stuff), basename, basename_len)) { + ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, Z_STRLEN_PP(stuff) - basename_len, 1); - MAKE_STD_ZVAL(temp); - ZVAL_STRINGL(temp, path_info, code, 0); - zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + MAKE_STD_ZVAL(temp); + ZVAL_STRINGL(temp, path_info, code, 0); + zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, sizeof(newname), (void *) &temp, sizeof(zval **), NULL); + } } } diff --git a/ext/phar/tests/frontcontroller23.phpt b/ext/phar/tests/frontcontroller23.phpt index 6080e56fb5..14f32dd6db 100644 --- a/ext/phar/tests/frontcontroller23.phpt +++ b/ext/phar/tests/frontcontroller23.phpt @@ -1,5 +1,5 @@ --TEST-- -Phar front controller include from cwd test 1 +Phar front controller with generic action router test --SKIPIF-- --ENV-- @@ -11,3 +11,5 @@ files/frontcontroller14.phar --EXPECTHEADERS-- Content-type: text/html --EXPECTF-- +string(9) "/hi/there" +string(%d) "phar://%sfrontcontroller23.php/html/index.php" \ No newline at end of file