entry->zip = 0;
}
#endif
- if (entry->linkname) {
- efree(entry->linkname);
- entry->linkname = 0;
+ if (entry->link) {
+ efree(entry->link);
+ entry->link = 0;
}
}
/* }}} */
int ret = 0;
if (idata->internal_file) {
- if (--idata->internal_file->fp_refcount <= 0) {
+ if (--idata->internal_file->fp_refcount < 0) {
idata->internal_file->fp_refcount = 0;
}
if (idata->fp && idata->fp != idata->internal_file->fp) {
}
etemp.filename = estrndup(etemp.filename, strlen(etemp.filename));
} else {
+ etemp.is_tar = phar->is_tar;
+ etemp.tar_type = '0';
etemp.filename = estrndup(path, path_len);
}
#else
ret->fp = entry->fp;
ret->position = 0;
ret->for_write = 1;
+ ret->is_zip = entry->is_zip;
+ ret->is_tar = entry->is_tar;
ret->internal_file = entry;
return ret;
}
if (error) {
spprintf(error, 4096, "phar error: could not copy full zip file contents of entry \"%s\"", entry->filename);
}
- fclose(fp);
+ php_stream_close(fp);
entry->fp = NULL;
zip_fclose(entry->zip);
entry->zip = NULL;
/* now use a decompression filter to inflate into our temp file */
if ((filter_name = phar_decompress_filter(entry, 0)) != NULL) {
- filter = php_stream_filter_create(phar_decompress_filter(phar, 0), NULL, php_stream_is_persistent(fp) TSRMLS_CC);
+ filter = php_stream_filter_create(filter_name, NULL, php_stream_is_persistent(fp) TSRMLS_CC);
} else {
filter = NULL;
}
if (!filter) {
- spprintf(error, 0, "phar error: unable to read phar \"%s\" (cannot create %s filter while decompressing file \"%s\")", phar->phar->fname, phar_decompress_filter(entry, 1), entry->filename);
+ spprintf(error, 0, "phar error: unable to read phar \"%s\" (cannot create %s filter while decompressing file \"%s\")", entry->phar->fname, phar_decompress_filter(entry, 1), entry->filename);
return NULL;
}
goto skip_phar;
}
if (strstr(file_handle->filename, ".phar.tar") && !strstr(file_handle->filename, ":\\")) {
- /* zip-based phar */
+ /* 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;
} while (read != 0);
myphar->fname = estrndup(fname, fname_len);
myphar->fname_len = fname_len;
+ myphar->fp = fp;
phar_request_initialize(TSRMLS_C);
zend_hash_add(&(PHAR_GLOBALS->phar_fname_map), myphar->fname, fname_len, (void*)&myphar, sizeof(phar_archive_data*), NULL);
if (actual_alias) {
if (pphar) {
*pphar = myphar;
}
- php_stream_close(fp);
return SUCCESS;
}
/* }}} */
phar_entry_info *entry = (phar_entry_info *) pDest;
struct _phar_pass_tar_info *fp = (struct _phar_pass_tar_info *)argument;
php_stream *file;
+ char padding[512];
if (entry->is_deleted) {
return ZEND_HASH_APPLY_REMOVE;
return ZEND_HASH_APPLY_STOP;
}
+ memset(padding, 0, 512);
+ php_stream_write(fp->new, padding, ((entry->uncompressed_filesize +511)&~511) - entry->uncompressed_filesize);
+
if (entry->fp) {
php_stream_close(entry->fp);
entry->fp = NULL;
php_stream *oldfile, *newfile, *stubfile;
int closeoldfile, free_user_stub;
struct _phar_pass_tar_info pass;
+ char *buf;
entry.flags = PHAR_ENT_PERM_DEF_FILE;
entry.timestamp = time(NULL);
entry.crc32 = phar_tar_checksum(archive->alias, archive->alias_len);
php_stream_write(entry.fp, archive->alias, archive->alias_len);
entry.uncompressed_filesize = archive->alias_len;
- zend_hash_add(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL);
+ zend_hash_update(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL);
}
/* set stub */
}
entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
entry.filename_len = sizeof(".phar/stub.php")-1;
- zend_hash_add(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL);
+ zend_hash_update(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL);
if (free_user_stub) {
efree(user_stub);
}
zend_hash_apply_with_argument(&archive->manifest, (apply_func_arg_t) phar_tar_writeheaders, (void *) &pass TSRMLS_CC);
+ /* add final zero blocks */
+ buf = (char *) ecalloc(1024, 1);
+ php_stream_write(newfile, buf, 1024);
+ efree(buf);
+
if (closeoldfile) {
php_stream_close(oldfile);
}