zend_hash_destroy(&phar->manifest);
phar->manifest.arBuckets = NULL;
}
+ if (phar->mounted_dirs.arBuckets) {
+ zend_hash_destroy(&phar->mounted_dirs);
+ phar->mounted_dirs.arBuckets = NULL;
+ }
if (phar->metadata) {
zval_ptr_dtor(&phar->metadata);
phar->metadata = 0;
/* set up our manifest */
zend_hash_init(&mydata->manifest, sizeof(phar_entry_info),
zend_get_hash_value, destroy_phar_manifest_entry, 0);
+ zend_hash_init(&mydata->mounted_dirs, sizeof(char *),
+ zend_get_hash_value, NULL, 0);
offset = halt_offset + manifest_len + 4;
memset(&entry, 0, sizeof(phar_entry_info));
entry.phar = mydata;
size_t internal_file_start;
size_t halt_offset;
HashTable manifest;
+ /* hash of mounted directory paths */
+ HashTable mounted_dirs;
php_uint32 flags;
php_uint32 min_timestamp;
php_uint32 max_timestamp;
myphar = (phar_archive_data *) ecalloc(1, sizeof(phar_archive_data));
zend_hash_init(&myphar->manifest, sizeof(phar_entry_info),
zend_get_hash_value, destroy_phar_manifest_entry, 0);
+ zend_hash_init(&myphar->mounted_dirs, sizeof(char *),
+ zend_get_hash_value, NULL, 0);
myphar->is_tar = 1;
/* remember whether this entire phar was compressed with gz/bzip2 */
myphar->flags = compression;
efree(entry.filename);
return FAILURE;
}
- entry.is_dir = ssb.sb.st_mode & S_IFDIR ? 1 : 0;
+ if (ssb.sb.st_mode & S_IFDIR) {
+ entry.is_dir = 1;
+ if (SUCCESS != zend_hash_add(&phar->mounted_dirs, path, path_len, (void *)&path, sizeof(char *), NULL)) {
+ /* directory already mounted */
+ efree(entry.link);
+ efree(entry.filename);
+ return FAILURE;
+ }
+ } else {
+ entry.is_dir = 0;
+ }
entry.uncompressed_filesize = entry.compressed_filesize = ssb.sb.st_size;
entry.flags = ssb.sb.st_mode;
if (SUCCESS == zend_hash_add(&phar->manifest, path, path_len, (void*)&entry, sizeof(phar_entry_info), NULL)) {
/* read in central directory */
zend_hash_init(&mydata->manifest, sizeof(phar_entry_info),
zend_get_hash_value, destroy_phar_manifest_entry, 0);
+ zend_hash_init(&mydata->mounted_dirs, sizeof(char *),
+ zend_get_hash_value, NULL, 0);
entry.phar = mydata;
entry.is_zip = 1;
entry.fp_type = PHAR_FP;