cellog Sun Oct 26 05:49:24 2008 UTC Modified files: /php-src/ext/phar phar.c phar_object.c util.c Log: MFB: fix several errors found by valgrind 1 - entry metadata not properly processed or retrieved from cached phars 2 - copy on write was using a void return value instead of int, a dangerous oversight in phar_update_cached_entry 3 - metadata creation in entries for cached phars was causing an invalid read http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar.c?r1=1.390&r2=1.391&diff_format=u Index: php-src/ext/phar/phar.c diff -u php-src/ext/phar/phar.c:1.390 php-src/ext/phar/phar.c:1.391 --- php-src/ext/phar/phar.c:1.390 Sun Oct 12 21:09:10 2008 +++ php-src/ext/phar/phar.c Sun Oct 26 05:49:24 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar.c,v 1.390 2008/10/12 21:09:10 tony2001 Exp $ */ +/* $Id: phar.c,v 1.391 2008/10/26 05:49:24 cellog Exp $ */ #define PHAR_MAIN 1 #include "phar_internal.h" @@ -1035,6 +1035,7 @@ /* check whether we have meta data, zero check works regardless of byte order */ if (mydata->is_persistent) { PHAR_GET_32(buffer, mydata->metadata_len); + if (!mydata->metadata_len) buffer -= 4; if (phar_parse_metadata(&buffer, &mydata->metadata, mydata->metadata_len TSRMLS_CC) == FAILURE) { MAPPHAR_FAIL("unable to read phar metadata in .phar file \"%s\""); } @@ -1114,7 +1115,9 @@ } if (entry.is_persistent) { - if (phar_parse_metadata(&buffer, &entry.metadata, 0 TSRMLS_CC) == FAILURE) { + PHAR_GET_32(buffer, entry.metadata_len); + if (!entry.metadata_len) buffer -= 4; + if (phar_parse_metadata(&buffer, &entry.metadata, entry.metadata_len TSRMLS_CC) == FAILURE) { pefree(entry.filename, entry.is_persistent); MAPPHAR_FAIL("unable to read file metadata in .phar file \"%s\""); } @@ -3622,7 +3625,7 @@ php_info_print_table_header(2, "Phar: PHP Archive support", "enabled"); php_info_print_table_row(2, "Phar EXT version", PHP_PHAR_VERSION); php_info_print_table_row(2, "Phar API version", PHP_PHAR_API_VERSION); - php_info_print_table_row(2, "CVS revision", "$Revision: 1.390 $"); + php_info_print_table_row(2, "CVS revision", "$Revision: 1.391 $"); php_info_print_table_row(2, "Phar-based phar archives", "enabled"); php_info_print_table_row(2, "Tar-based phar archives", "enabled"); php_info_print_table_row(2, "ZIP-based phar archives", "enabled"); http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar_object.c?r1=1.289&r2=1.290&diff_format=u Index: php-src/ext/phar/phar_object.c diff -u php-src/ext/phar/phar_object.c:1.289 php-src/ext/phar/phar_object.c:1.290 --- php-src/ext/phar/phar_object.c:1.289 Fri Oct 24 14:34:15 2008 +++ php-src/ext/phar/phar_object.c Sun Oct 26 05:49:24 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.289 2008/10/24 14:34:15 felipe Exp $ */ +/* $Id: phar_object.c,v 1.290 2008/10/26 05:49:24 cellog Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -4583,6 +4583,15 @@ PHAR_ENTRY_OBJECT(); if (entry_obj->ent.entry->metadata) { + if (entry_obj->ent.entry->is_persistent) { + zval *ret; + char *buf = estrndup((char *) entry_obj->ent.entry->metadata, entry_obj->ent.entry->metadata_len); + /* assume success, we would have failed before */ + phar_parse_metadata(&buf, &ret, entry_obj->ent.entry->metadata_len TSRMLS_CC); + efree(buf); + RETURN_ZVAL(ret, 0, 1); + return; + } RETURN_ZVAL(entry_obj->ent.entry->metadata, 1, 0); } } http://cvs.php.net/viewvc.cgi/php-src/ext/phar/util.c?r1=1.68&r2=1.69&diff_format=u Index: php-src/ext/phar/util.c diff -u php-src/ext/phar/util.c:1.68 php-src/ext/phar/util.c:1.69 --- php-src/ext/phar/util.c:1.68 Sun Oct 12 19:40:29 2008 +++ php-src/ext/phar/util.c Sun Oct 26 05:49:24 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: util.c,v 1.68 2008/10/12 19:40:29 cellog Exp $ */ +/* $Id: util.c,v 1.69 2008/10/26 05:49:24 cellog Exp $ */ #include "phar_internal.h" @@ -2198,7 +2198,7 @@ } /* }}} */ -static void phar_update_cached_entry(void *data, void *argument) /* {{{ */ +static int phar_update_cached_entry(void *data, void *argument) /* {{{ */ { phar_entry_info *entry = (phar_entry_info *)data; TSRMLS_FETCH(); @@ -2221,7 +2221,7 @@ if (entry->metadata_len) { char *buf = estrndup((char *) entry->metadata, entry->metadata_len); /* assume success, we would have failed before */ - phar_parse_metadata((char **) &entry->metadata, &entry->metadata, entry->metadata_len TSRMLS_CC); + phar_parse_metadata((char **) &buf, &entry->metadata, entry->metadata_len TSRMLS_CC); efree(buf); } else { zval *t; @@ -2239,6 +2239,7 @@ entry->metadata_str.len = 0; } } + return ZEND_HASH_APPLY_KEEP; } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php