*/
static void phar_destroy_phar_data(phar_archive_data *data TSRMLS_DC) /* {{{ */
{
+#if HAVE_PHAR_ZIP
+ if (data->zip) {
+ zip_close(data->zip);
+ data->zip = 0;
+ }
+#endif
if (data->alias && data->alias != data->fname) {
efree(data->alias);
data->alias = NULL;
}
if (data->manifest.arBuckets) {
zend_hash_destroy(&data->manifest);
+ data->manifest.arBuckets = NULL;
}
if (data->metadata) {
zval_ptr_dtor(&data->metadata);
php_stream_close(data->fp);
data->fp = 0;
}
-#if HAVE_PHAR_ZIP
- if (data->zip) {
- zip_close(data->zip);
- data->zip = 0;
- }
-#endif
efree(data);
}
/* }}}*/
}
zip_close(zip);
zend_hash_destroy(&(mydata->manifest));
+ mdata->manifest.arBuckets = NULL;
efree(mydata);
if (error) {
spprintf(error, 0, "bz2 extension is required for Bzip2 compressed zip-based .phar file \"%s\"", fname);
}
zip_close(zip);
zend_hash_destroy(&(mydata->manifest));
+ mydata->manifest.arBuckets = NULL;
efree(mydata);
if (error) {
spprintf(error, 0, "bz2 extension is required for gz compressed zip-based .phar file \"%s\"", fname);
/* fprintf(stderr, "Fragment: %s\n", resource->fragment);*/
}
#endif
- if (PHAR_GLOBALS->phar_plain_map.arBuckets && zend_hash_exists(&(PHAR_GLOBALS->phar_plain_map), arch, arch_len+1)) {
+ if (PHAR_GLOBALS->request_init && PHAR_GLOBALS->phar_plain_map.arBuckets && zend_hash_exists(&(PHAR_GLOBALS->phar_plain_map), arch, arch_len+1)) {
return resource;
}
if (mode[0] == 'w' || (mode[0] == 'r' && mode[1] == '+')) {
save = zend_compile_file; /* restore current handler or we cause trouble */
zend_compile_file = phar_orig_compile_file;
- if (strstr(file_handle->filename, ".phar.zip") && !strstr(file_handle->filename, ":\\")) {
- /* zip-based phar */
- spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
- file_handle->type = ZEND_HANDLE_FILENAME;
- file_handle->free_filename = 1;
- file_handle->filename = name;
- if (file_handle->opened_path) {
- efree(file_handle->opened_path);
+
+ fname = zend_get_executed_filename(TSRMLS_C);
+ fname_len = strlen(fname);
+ if (fname_len == sizeof("[no active file]")-1 && !strncmp(fname, "[no active file]", fname_len)) {
+ if (strstr(file_handle->filename, ".phar.zip") && !strstr(file_handle->filename, ":\\")) {
+ /* zip-based phar */
+ spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
+ file_handle->type = ZEND_HANDLE_FILENAME;
+ file_handle->free_filename = 1;
+ file_handle->filename = name;
+ if (file_handle->opened_path) {
+ efree(file_handle->opened_path);
+ }
+ goto skip_phar;
}
- goto skip_phar;
- }
- if (strstr(file_handle->filename, ".phar.tar") && !strstr(file_handle->filename, ":\\")) {
- /* tar-based phar */
- spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
- file_handle->type = ZEND_HANDLE_FILENAME;
- file_handle->free_filename = 1;
- file_handle->filename = name;
- if (file_handle->opened_path) {
- efree(file_handle->opened_path);
+ if (strstr(file_handle->filename, ".phar.tar") && !strstr(file_handle->filename, ":\\")) {
+ /* tar-based phar */
+ spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");
+ file_handle->type = ZEND_HANDLE_FILENAME;
+ file_handle->free_filename = 1;
+ file_handle->filename = name;
+ if (file_handle->opened_path) {
+ efree(file_handle->opened_path);
+ }
+ goto skip_phar;
}
- goto skip_phar;
}
if (zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map))) {
char *arch, *entry;
int arch_len, entry_len;
- fname = zend_get_executed_filename(TSRMLS_C);
- fname_len = strlen(fname);
if (strncasecmp(fname, "phar://", 7)) {
goto skip_phar;
}
orig->internal_function.handler = PHAR_G(orig_fopen);
}
zend_hash_destroy(&(PHAR_GLOBALS->phar_alias_map));
+ PHAR_GLOBALS->phar_alias_map.arBuckets = NULL;
zend_hash_destroy(&(PHAR_GLOBALS->phar_fname_map));
+ PHAR_GLOBALS->phar_fname_map.arBuckets = NULL;
zend_hash_destroy(&(PHAR_GLOBALS->phar_plain_map));
+ PHAR_GLOBALS->phar_plain_map.arBuckets = NULL;
PHAR_GLOBALS->request_init = 0;
}
PHAR_GLOBALS->request_done = 1;
zend_hash_apply_with_arguments(&PHAR_G(phar_plain_map), phar_get_extract_list, 1, return_value);
}
/* }}} */
-
static int phar_file_type(HashTable *mimes, char *file, char **mime_type TSRMLS_DC)
{
char *ext;
return -1;
}
phar->fp = phar->internal_file->fp;
+ if (phar->internal_file->fp == phar->phar->fp) {
+ phar->zero = phar->internal_file->offset_within_phar;
+ }
}
- php_stream_seek(phar->fp, phar->position + phar->zero, SEEK_SET);
+ php_stream_seek(phar->fp, phar->zero, SEEK_SET);
do {
if (!phar->zero) {
got = php_stream_read(phar->fp, buf, 8192);
} while (1);
phar_entry_delref(phar TSRMLS_CC);
+ zend_bailout();
return PHAR_MIME_OTHER;
case PHAR_MIME_PHP:
phar_entry_delref(phar TSRMLS_CC);
efree(error);
}
phar_do_404(fname, fname_len, f404, f404_len TSRMLS_CC);
- phar_entry_delref(phar TSRMLS_CC);
zend_bailout();
return;
} else {