]> granicus.if.org Git - php/commitdiff
unixify path separators in tar-based phars, always use this value for duping alias
authorGreg Beaver <cellog@php.net>
Mon, 14 Jan 2008 06:19:43 +0000 (06:19 +0000)
committerGreg Beaver <cellog@php.net>
Mon, 14 Jan 2008 06:19:43 +0000 (06:19 +0000)
# found by delete.phpt unit test.  I love unit tests

ext/phar/phar.c
ext/phar/tar.c
ext/phar/zip.c

index 185f02d58ac570ffa50ebf5933dfd741628a706a..df70fc284bca8ec99ca1299a32930453df8f52ac 100644 (file)
@@ -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;
index d9094eda26e4616b24603a70aac5677d421e66b6..e1b371bc9af0b4501ef37f89776994fe7928f3ff 100644 (file)
@@ -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;
        }
index 9088cab1ded31bb742bded9580e09319329b427d..236509f739b80444274e168dc16be29078f42af7 100644 (file)
@@ -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);