From: Greg Beaver Date: Mon, 14 Jan 2008 06:19:43 +0000 (+0000) Subject: unixify path separators in tar-based phars, always use this value for duping alias X-Git-Tag: RELEASE_2_0_0a1~910 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34bb2d7e761fa075cb92602d9899d8670fb60169;p=php unixify path separators in tar-based phars, always use this value for duping alias # found by delete.phpt unit test. I love unit tests --- diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 185f02d58a..df70fc284b 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1424,7 +1424,7 @@ int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alias, int phar_unixify_path_separators(mydata->fname, fname_len); #endif mydata->fname_len = fname_len; - mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(fname, fname_len); + mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len); mydata->alias_len = alias ? alias_len : fname_len; mydata->sig_flags = sig_flags; mydata->sig_len = sig_len; diff --git a/ext/phar/tar.c b/ext/phar/tar.c index d9094eda26..e1b371bc9a 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -37,6 +37,20 @@ static php_uint32 phar_tar_number(char *buf, int len) /* {{{ */ } /* }}} */ +#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 /* adapted from format_octal() in libarchive * * Copyright (c) 2003-2007 Tim Kientzle @@ -150,7 +164,7 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i size_t pos = 0, read; tar_header *hdr; php_uint32 sum1, sum2, size, old; - phar_archive_data *myphar; + phar_archive_data *myphar, **actual; if (error) { *error = NULL; @@ -280,15 +294,27 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i read = php_stream_read(fp, buf, sizeof(buf)); } while (read != 0); myphar->fname = estrndup(fname, fname_len); +#ifdef PHP_WIN32 + phar_unixify_path_separators(myphar->fname, fname_len); +#endif myphar->fname_len = fname_len; myphar->fp = fp; phar_request_initialize(TSRMLS_C); - zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), fname, fname_len, (void*)&myphar, sizeof(phar_archive_data*), NULL); + if (SUCCESS != zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), myphar->fname, fname_len, (void*)&myphar, sizeof(phar_archive_data*), (void **)&actual)) { + if (error) { + spprintf(error, 4096, "phar error: Unable to add tar-based phar \"%s\" to phar registry", fname); + } + php_stream_close(fp); + zend_hash_destroy(&myphar->manifest); + efree(myphar); + return FAILURE; + } + myphar = *actual; if (actual_alias) { myphar->is_explicit_alias = 1; zend_hash_add(&(PHAR_GLOBALS->phar_alias_map), actual_alias, myphar->alias_len, (void*)&myphar, sizeof(phar_archive_data*), NULL); } else { - myphar->alias = estrndup(fname, fname_len); + myphar->alias = estrndup(myphar->fname, fname_len); myphar->alias_len = fname_len; myphar->is_explicit_alias = 0; } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 9088cab1de..236509f739 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -223,7 +223,7 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph /* ignore all errors in loading up manifest */ zip_error_clear(zip); - zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), fname, fname_len, (void*)&mydata, sizeof(phar_archive_data*), NULL); + zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), mydata->fname, fname_len, (void*)&mydata, sizeof(phar_archive_data*), NULL); if (register_alias) { mydata->is_explicit_alias = 1; zend_hash_add(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void*)&mydata, sizeof(phar_archive_data*), NULL);