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

Reply via email to