stas Wed, 07 Mar 2012 07:38:57 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=323985
Log: MFH: Fixed bug #61173 (Unable to detect error from finfo constructor). Bug: https://bugs.php.net/61173 (Assigned) Unable to detect error from finfo constructor Changed paths: U php/php-src/branches/PHP_5_4/ext/fileinfo/fileinfo.c A php/php-src/branches/PHP_5_4/ext/fileinfo/tests/bug61173.phpt Modified: php/php-src/branches/PHP_5_4/ext/fileinfo/fileinfo.c =================================================================== --- php/php-src/branches/PHP_5_4/ext/fileinfo/fileinfo.c 2012-03-07 06:36:46 UTC (rev 323984) +++ php/php-src/branches/PHP_5_4/ext/fileinfo/fileinfo.c 2012-03-07 07:38:57 UTC (rev 323985) @@ -76,9 +76,9 @@ } \ } -/* {{{ finfo_objects_dtor +/* {{{ finfo_objects_free */ -static void finfo_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC) +static void finfo_objects_free(void *object TSRMLS_DC) { struct finfo_object *intern = (struct finfo_object *) object; @@ -107,7 +107,8 @@ intern->ptr = NULL; - retval.handle = zend_objects_store_put(intern, finfo_objects_dtor, NULL, NULL TSRMLS_CC); + retval.handle = zend_objects_store_put(intern, NULL, + finfo_objects_free, NULL TSRMLS_CC); retval.handlers = (zend_object_handlers *) &finfo_object_handlers; return retval; @@ -275,6 +276,15 @@ } /* }}} */ +#define FILEINFO_DESTROY_OBJECT(object) \ + do { \ + if (object) { \ + zend_object_store_ctor_failed(object TSRMLS_CC); \ + zval_dtor(object); \ + ZVAL_NULL(object); \ + } \ + } while (0) + /* {{{ proto resource finfo_open([int options [, string arg]]) Create a new fileinfo resource. */ PHP_FUNCTION(finfo_open) @@ -287,12 +297,13 @@ char resolved_path[MAXPATHLEN]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lp", &options, &file, &file_len) == FAILURE) { + FILEINFO_DESTROY_OBJECT(object); RETURN_FALSE; } - + if (object) { struct finfo_object *finfo_obj = (struct finfo_object*)zend_object_store_get_object(object TSRMLS_CC); - + if (finfo_obj->ptr) { magic_close(finfo_obj->ptr->magic); efree(finfo_obj->ptr); @@ -309,9 +320,11 @@ #else if (php_check_open_basedir(file TSRMLS_CC)) { #endif + FILEINFO_DESTROY_OBJECT(object); RETURN_FALSE; } if (!expand_filepath_with_mode(file, resolved_path, NULL, 0, CWD_EXPAND TSRMLS_CC)) { + FILEINFO_DESTROY_OBJECT(object); RETURN_FALSE; } file = resolved_path; @@ -325,21 +338,23 @@ if (finfo->magic == NULL) { efree(finfo); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid mode '%ld'.", options); - RETURN_FALSE; + FILEINFO_DESTROY_OBJECT(object); + RETURN_FALSE; } if (magic_load(finfo->magic, file) == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to load magic database at '%s'.", file); magic_close(finfo->magic); efree(finfo); + FILEINFO_DESTROY_OBJECT(object); RETURN_FALSE; - } + } if (object) { FILEINFO_REGISTER_OBJECT(object, finfo); } else { ZEND_REGISTER_RESOURCE(return_value, finfo, le_fileinfo); - } + } } /* }}} */ Added: php/php-src/branches/PHP_5_4/ext/fileinfo/tests/bug61173.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/fileinfo/tests/bug61173.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/fileinfo/tests/bug61173.phpt 2012-03-07 07:38:57 UTC (rev 323985) @@ -0,0 +1,14 @@ +--TEST-- +Bug #61173: Unable to detect error from finfo constructor +--SKIPIF-- +<?php +if (!class_exists('finfo')) + die('skip no fileinfo extension'); +--FILE-- +<?php + +$finfo = new finfo(1, '', false); +var_dump($finfo); +--EXPECTF-- +Warning: finfo::finfo() expects at most 2 parameters, 3 given in %s on line %d +NULL
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php