From f6af23d30ea53bda72e4d63a48873df0b862e312 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Wed, 28 May 2008 21:50:41 +0000 Subject: [PATCH] MF5: Fix code path in phar_open_compiled_file() that tries to open not-yet-loaded phar and fails on compressed files # By Gregory's request # Sorry, can't find how to write test case for that - it reproduces # for me only under bytecode-caching. Suggestions welcome. --- ext/phar/phar.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 0b595a9c8f..5a203b5347 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1886,6 +1886,8 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC) zval *halt_constant; php_stream *fp; int fname_len; + char *actual = NULL; + int ret; if (error) { *error = NULL; @@ -1915,16 +1917,38 @@ int phar_open_compiled_file(char *alias, int alias_len, char **error TSRMLS_DC) halt_offset = Z_LVAL(*halt_constant); FREE_ZVAL(halt_constant); - fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL); +#if PHP_MAJOR_VERSION < 6 + if (PG(safe_mode) && (!php_checkuid(fname, NULL, CHECKUID_ALLOW_ONLY_FILE))) { + return FAILURE; + } +#endif + + if (php_check_open_basedir(fname TSRMLS_CC)) { + return FAILURE; + } + + fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, &actual); if (!fp) { - if (error) { + if (error) { spprintf(error, 0, "unable to open phar for reading \"%s\"", fname); - } + } + if (actual) { + efree(actual); + } return FAILURE; - } + } - return phar_open_file(fp, fname, fname_len, alias, alias_len, halt_offset, NULL, PHAR_FILE_COMPRESSED_NONE, error TSRMLS_CC); + if (actual) { + fname = actual; + fname_len = strlen(actual); + } + + ret = phar_open_fp(fp, fname, fname_len, alias, alias_len, REPORT_ERRORS, NULL, error TSRMLS_CC); + if (actual) { + efree(actual); + } + return ret; } /* }}} */ -- 2.50.1