svn: /php/php-src/branches/PHP_5_4/ext/fileinfo/ fileinfo.c tests/bug61173.phpt
| From: | Stanislav Malyshev | Date: | Wed, 07 Mar 2012 07:38:57 +0000 |
| Subject: | svn: /php/php-src/branches/PHP_5_4/ext/fileinfo/ fileinfo.c tests/bug61173.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-67856@lists.php.net to get a copy of this message | ||
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