From: Greg Beaver Date: Thu, 15 Nov 2007 05:21:11 +0000 (+0000) Subject: Ensure that the same phar can be referenced in multiple logical ways: X-Git-Tag: RELEASE_2_0_0a1~1366 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a86b3d6ea4a6137d94b1801c79442e4d953bdd8;p=php Ensure that the same phar can be referenced in multiple logical ways: 1) full path, with \ or / path separator 2) relative path to getcwd() This should fix the last remaining windows-related quirks as well as similar problems on unix --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 386d11449b..29803c4467 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -70,6 +70,21 @@ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */ } /* }}}*/ +#ifdef PHP_WIN32 +static inline void phar_unixify_path_separators(char *path, int path_len) /* {{{ */ +{ + char *s; + + /* unixify win paths */ + for (s = path; s - path < path_len; s++) { + if (*s == '\\') { + *s = '/'; + } + } +} +/* }}} */ +#endif + static void phar_split_extract_list(TSRMLS_D) { char *tmp = estrdup(PHAR_GLOBALS->extract_list); @@ -291,6 +306,8 @@ static void destroy_phar_manifest(void *pDest) /* {{{ */ static int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, char *alias, int alias_len, char **error TSRMLS_DC) /* {{{ */ { phar_archive_data *fd, **fd_ptr; + char *my_realpath, *save; + int save_len; phar_request_initialize(TSRMLS_C); @@ -310,19 +327,39 @@ static int phar_get_archive(phar_archive_data **archive, char *fname, int fname_ return SUCCESS; } } + my_realpath = NULL; + save = fname; + save_len = fname_len; if (fname && fname_len) { + my_realpath = expand_filepath(fname, my_realpath TSRMLS_CC); + if (my_realpath) { + fname_len = strlen(my_realpath); + fname = my_realpath; + } +#ifdef PHP_WIN32 + phar_unixify_path_separators(fname, fname_len); +#endif if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), fname, fname_len, (void**)&fd_ptr)) { *archive = *fd_ptr; fd = *fd_ptr; if (alias && alias_len) { zend_hash_add(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void*)&fd, sizeof(phar_archive_data*), NULL); } + if (my_realpath) { + efree(my_realpath); + } return SUCCESS; } - if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), fname, fname_len, (void**)&fd_ptr)) { + if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), save, save_len, (void**)&fd_ptr)) { + if (my_realpath) { + efree(my_realpath); + } *archive = *fd_ptr; return SUCCESS; } + if (my_realpath) { + efree(my_realpath); + } } return FAILURE; } @@ -822,6 +859,9 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int long offset; int register_alias, sig_len; char *signature = NULL; +#ifdef PHP_WIN32 + phar_unixify_path_separators(fname, fname_len); +#endif if (pphar) { *pphar = NULL; @@ -1255,6 +1295,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */ { phar_archive_data *mydata; + char *my_realpath; int register_alias; php_stream *fp; @@ -1307,7 +1348,18 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al } zend_hash_init(&mydata->manifest, sizeof(phar_entry_info), zend_get_hash_value, destroy_phar_manifest, 0); - mydata->fname = estrndup(fname, fname_len); + my_realpath = NULL; + my_realpath = expand_filepath(fname, my_realpath TSRMLS_CC); + if (my_realpath) { + fname_len = strlen(my_realpath); +#ifdef PHP_WIN32 + phar_unixify_path_separators(my_realpath, fname_len); +#endif + fname = my_realpath; + mydata->fname = my_realpath; + } else { + mydata->fname = estrndup(fname, fname_len); + } mydata->fname_len = fname_len; mydata->alias = alias ? estrndup(alias, alias_len) : mydata->fname; mydata->alias_len = alias ? alias_len : fname_len; @@ -1483,6 +1535,7 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le } #ifdef PHP_WIN32 + phar_unixify_path_separators(filename, filename_len); if (filename_len > 3 && *filename == '/' && *(filename + 2) == ':' && *(filename + 3) == '/') { filename++; filename_len--; @@ -1849,6 +1902,9 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, char *pat php_stream *fp, *fpf; zval **pzoption, *metadata; uint host_len; +#ifdef PHP_WIN32 + phar_unixify_path_separators(path, strlen(path)); +#endif resource = php_url_parse(path); @@ -3549,6 +3605,9 @@ static php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path phar_archive_data *phar; phar_entry_info *entry; uint host_len; +#ifdef PHP_WIN32 + phar_unixify_path_separators(path, strlen(path)); +#endif resource = php_url_parse(path);