]> granicus.if.org Git - php/commitdiff
- Fixed bug #61173 (Unable to detect error from finfo constructor).
authorGustavo André dos Santos Lopes <cataphract@php.net>
Fri, 24 Feb 2012 10:01:39 +0000 (10:01 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Fri, 24 Feb 2012 10:01:39 +0000 (10:01 +0000)
- Tidied up NEWS

NEWS
ext/fileinfo/fileinfo.c
ext/fileinfo/tests/bug61173.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 097de8147a46b9f57536b866b90ac0c0c1cfd819..f7d30d696ee4e0ea1f89cc3ae704db3f45ac3ca9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,22 +1,16 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2012, PHP 5.3.11
+
 - Core:
   . Improved max_input_vars directive to check nested variables (Dmitry).
   . Fixed bug #61095 (Incorect lexing of 0x00*+<NUM>). (Etienne)
-
-- Session:
-  . Fixed bug #60860 (session.save_handler=user without defined function core
-    dumps). (Felipe)
-
-- Tidy:
-  . Fixed bug #54682 (tidy null pointer dereference). (Tony, David Soria Parra) 
-
-- Core:
   . Fixed bug #61072 (Memory leak when restoring an exception handler).
     (Nikic, Laruence)
-  . Fixed bug #61000 (Exceeding max nesting level doesn't delete numerical vars).
-    (Laruence)
+  . Fixed bug #61058 (array_fill leaks if start index is PHP_INT_MAX).
+       (Laruence)
+  . Fixed bug #61000 (Exceeding max nesting level doesn't delete numerical
+       vars). (Laruence)
   . Fix bug #60895 (Possible invalid handler usage in windows random
     functions). (Pierre)
   . Fixed bug #60825 (Segfault when running symfony 2 tests).
@@ -25,18 +19,12 @@ PHP                                                                        NEWS
     (rui, Gustavo)
   . Fixed bug #51860 (Include fails with toplevel symlink to /). (Dmitry)
 
+- Fileinfo
+  . Fixed bug #61173 (Unable to detect error from finfo constructor). (Gustavo)
+
 - Firebird Database extension (ibase):
   . Fixed bug #60802 (ibase_trans() gives segfault when passing params).
 
-- Streams:
-  . Fixed bug #61115 (stream related segfault on fatal error in
-    php_stream_context_link). (Gustavo)
-  . Further fix for bug #60455 (stream_get_line misbehaves if EOF is not detected
-    together with the last read). (Gustavo)
-  . Fixed bug #60817 (stream_get_line() reads from stream even when there is
-    already sufficient data buffered). stream_get_line() now behaves more like
-    fgets(), as is documented. (Gustavo)
-
 - PHP-FPM SAPI:
   . Fixed bug #60811 (php-fpm compilation problem). (rasmus)
  
@@ -53,9 +41,21 @@ PHP                                                                        NEWS
   . Fixed bug #60968 (Late static binding doesn't work with 
     ReflectionMethod::invokeArgs()). (Laruence)
 
-- Array:
-  . Fixed bug #61058 (array_fill leaks if start index is PHP_INT_MAX).
-    (Laruence)
+- Session:
+  . Fixed bug #60860 (session.save_handler=user without defined function core
+    dumps). (Felipe)
+
+- Streams:
+  . Fixed bug #61115 (stream related segfault on fatal error in
+    php_stream_context_link). (Gustavo)
+  . Further fix for bug #60455 (stream_get_line misbehaves if EOF is not
+    detected together with the last read). (Gustavo)
+  . Fixed bug #60817 (stream_get_line() reads from stream even when there is
+    already sufficient data buffered). stream_get_line() now behaves more like
+    fgets(), as is documented. (Gustavo)
+
+- Tidy:
+  . Fixed bug #54682 (tidy null pointer dereference). (Tony, David Soria Parra)
 
 - XMLRPC:
   . Fixed bug #61097 (Memory leak in xmlrpc functions copying zvals). (Nikic)
index 8481cc62080d376093192ed7b6a0411f576e939d..caab03bac34c9d4932c9c1bce911cf16dbf961f0 100644 (file)
@@ -76,9 +76,9 @@ struct finfo_object {
        } \
 }
 
-/* {{{ 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;
 
@@ -108,7 +108,8 @@ PHP_FILEINFO_API zend_object_value finfo_objects_new(zend_class_entry *class_typ
 
        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;
@@ -276,6 +277,15 @@ PHP_MINFO_FUNCTION(fileinfo)
 }
 /* }}} */
 
+#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)
@@ -288,6 +298,7 @@ PHP_FUNCTION(finfo_open)
        char resolved_path[MAXPATHLEN];
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &options, &file, &file_len) == FAILURE) {
+               FILEINFO_DESTROY_OBJECT(object);
                RETURN_FALSE;
        }
        
@@ -305,9 +316,11 @@ PHP_FUNCTION(finfo_open)
                file = NULL;
        } else if (file && *file) { /* user specified file, perform open_basedir checks */
                if (strlen(file) != file_len) {
+                       FILEINFO_DESTROY_OBJECT(object);
                        RETURN_FALSE;
                }
                if (!VCWD_REALPATH(file, resolved_path)) {
+                       FILEINFO_DESTROY_OBJECT(object);
                        RETURN_FALSE;
                }
                file = resolved_path;
@@ -317,6 +330,7 @@ PHP_FUNCTION(finfo_open)
 #else
                if (php_check_open_basedir(file TSRMLS_CC)) {
 #endif
+                       FILEINFO_DESTROY_OBJECT(object);
                        RETURN_FALSE;
                }
        }
@@ -329,21 +343,23 @@ PHP_FUNCTION(finfo_open)
        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);
-       }       
+       }
 }
 /* }}} */
 
diff --git a/ext/fileinfo/tests/bug61173.phpt b/ext/fileinfo/tests/bug61173.phpt
new file mode 100644 (file)
index 0000000..521176f
--- /dev/null
@@ -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