cellog Sat Oct 11 22:12:18 2008 UTC
Added files:
/php-src/ext/phar/tests/tar/files links.phar.tar
Modified files:
/php-src/ext/phar stream.c util.c
/php-src/ext/phar/tests/tar links6.phpt
Log:
MFB: fix reading links from streams (works with PharFileInfo->getContent())
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/stream.c?r1=1.36&r2=1.37&diff_format=u
Index: php-src/ext/phar/stream.c
diff -u php-src/ext/phar/stream.c:1.36 php-src/ext/phar/stream.c:1.37
--- php-src/ext/phar/stream.c:1.36 Fri Sep 26 23:35:11 2008
+++ php-src/ext/phar/stream.c Sat Oct 11 22:12:18 2008
@@ -359,8 +359,15 @@
{
phar_entry_data *data = (phar_entry_data *)stream->abstract;
size_t got;
+ phar_entry_info *entry;
+
+ if (data->internal_file->link) {
+ entry = phar_get_link_source(data->internal_file TSRMLS_CC);
+ } else {
+ entry = data->internal_file;
+ }
- if (data->internal_file->is_deleted) {
+ if (entry->is_deleted) {
stream->eof = 1;
return 0;
}
@@ -368,9 +375,9 @@
/* use our proxy position */
php_stream_seek(data->fp, data->position + data->zero, SEEK_SET);
- got = php_stream_read(data->fp, buf, MIN(count,
data->internal_file->uncompressed_filesize - data->position));
+ got = php_stream_read(data->fp, buf, MIN(count,
entry->uncompressed_filesize - data->position));
data->position = php_stream_tell(data->fp) - data->zero;
- stream->eof = (data->position == (off_t)
data->internal_file->uncompressed_filesize);
+ stream->eof = (data->position == (off_t) entry->uncompressed_filesize);
return got;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/util.c?r1=1.66&r2=1.67&diff_format=u
Index: php-src/ext/phar/util.c
diff -u php-src/ext/phar/util.c:1.66 php-src/ext/phar/util.c:1.67
--- php-src/ext/phar/util.c:1.66 Thu Oct 9 00:51:27 2008
+++ php-src/ext/phar/util.c Sat Oct 11 22:12:18 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: util.c,v 1.66 2008/10/09 00:51:27 cellog Exp $ */
+/* $Id: util.c,v 1.67 2008/10/11 22:12:18 cellog Exp $ */
#include "phar_internal.h"
@@ -65,12 +65,13 @@
phar_entry_info *phar_get_link_source(phar_entry_info *entry TSRMLS_DC) /* {{{
*/
{
phar_entry_info *link_entry;
- char *link = phar_get_link_location(entry TSRMLS_CC);
+ char *link;
if (!entry->link) {
return entry;
}
+ link = phar_get_link_location(entry TSRMLS_CC);
if (SUCCESS == zend_hash_find(&(entry->phar->manifest), entry->link,
strlen(entry->link), (void **)&link_entry) ||
SUCCESS == zend_hash_find(&(entry->phar->manifest), link,
strlen(link), (void **)&link_entry)) {
if (link != entry->link) {
@@ -680,13 +681,13 @@
phar_seek_efp(entry, 0, SEEK_END, 0, 0 TSRMLS_CC);
}
} else {
- if (entry->link) {
- efree(entry->link);
- entry->link = NULL;
- entry->tar_type = (entry->is_tar ? TAR_FILE : '\0');
- }
-
if (for_write) {
+ if (entry->link) {
+ efree(entry->link);
+ entry->link = NULL;
+ entry->tar_type = (entry->is_tar ? TAR_FILE :
'\0');
+ }
+
if (for_trunc) {
if (FAILURE ==
phar_create_writeable_entry(phar, entry, error TSRMLS_CC)) {
return FAILURE;
@@ -711,7 +712,11 @@
(*ret)->is_zip = entry->is_zip;
(*ret)->is_tar = entry->is_tar;
(*ret)->fp = phar_get_efp(entry, 1 TSRMLS_CC);
- (*ret)->zero = phar_get_fp_offset(entry TSRMLS_CC);
+ if (entry->link) {
+ (*ret)->zero = phar_get_fp_offset(phar_get_link_source(entry
TSRMLS_CC) TSRMLS_CC);
+ } else {
+ (*ret)->zero = phar_get_fp_offset(entry TSRMLS_CC);
+ }
if (!phar->is_persistent) {
++(entry->fp_refcount);
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/tests/tar/links6.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/phar/tests/tar/links6.phpt
diff -u /dev/null php-src/ext/phar/tests/tar/links6.phpt:1.2
--- /dev/null Sat Oct 11 22:12:18 2008
+++ php-src/ext/phar/tests/tar/links6.phpt Sat Oct 11 22:12:18 2008
@@ -0,0 +1,21 @@
+--TEST--
+Phar: test nested linked files
+--SKIPIF--
+<?php
+if (!extension_loaded("phar")) die("skip");
+?>
+--FILE--
+<?php
+echo file_get_contents('phar://' . dirname(__FILE__) .
'/files/links.phar.tar/link2');
+echo file_get_contents('phar://' . dirname(__FILE__) .
'/files/links.phar.tar/link1');
+echo file_get_contents('phar://' . dirname(__FILE__) .
'/files/links.phar.tar/testit.txt');
+?>
+===DONE===
+--EXPECT--
+hi there
+
+hi there
+
+hi there
+
+===DONE===
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/tests/tar/files/links.phar.tar?view=markup&rev=1.1
Index: php-src/ext/phar/tests/tar/files/links.phar.tar
+++ php-src/ext/phar/tests/tar/files/links.phar.tar
link1
__HALT_COMPILER();
?>
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php