]> granicus.if.org Git - php/commitdiff
- MFH (Ilia's changes)
authorMarcus Boerger <helly@php.net>
Tue, 9 Jan 2007 18:38:38 +0000 (18:38 +0000)
committerMarcus Boerger <helly@php.net>
Tue, 9 Jan 2007 18:38:38 +0000 (18:38 +0000)
ext/spl/php_spl.c
ext/spl/spl_array.c
ext/spl/tests/bug40036.phpt [new file with mode: 0644]
main/main.c
main/php_main.h

index c961f0e4a4ed87bffc647ff4f453421174d61bb7..8c403e4a4eb9031755b771d3d7d2d9a48f621a20 100755 (executable)
@@ -24,6 +24,7 @@
 
 #include "php.h"
 #include "php_ini.h"
+#include "php_main.h"
 #include "ext/standard/info.h"
 #include "php_spl.h"
 #include "spl_functions.h"
@@ -212,24 +213,12 @@ int spl_autoload(const zstr class_name, const zstr lc_name, int class_name_len,
        zend_file_handle file_handle;
        zend_op_array *new_op_array;
        zval *result = NULL;
-       zval err_mode;
        int ret;
 
        /* UTODO: Wewant the stream toacept a zstrfor opening */
        class_file_len = spprintf(&class_file, 0, "%v%v", lc_name, file_extension);
 
-       ZVAL_LONG(&err_mode, EG(error_reporting));
-       if (Z_LVAL(err_mode)) {
-               php_alter_ini_entry("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
-       }
-
-       ret = zend_stream_open(class_file, &file_handle TSRMLS_CC);
-
-       if (!EG(error_reporting) && Z_LVAL(err_mode) != EG(error_reporting)) {
-               convert_to_string(&err_mode);
-               zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), Z_STRVAL(err_mode), Z_STRLEN(err_mode), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
-               zendi_zval_dtor(err_mode);
-       }
+       ret = php_stream_open_for_zend_ex(class_file, &file_handle, ENFORCE_SAFE_MODE|USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC);
 
        if (ret == SUCCESS) {
                if (!file_handle.opened_path) {
index 7e0daec587729fce1a161805b90cb313e91dd924..57372eadc5e2dca9350a638f86631f91f5bbfd9f 100755 (executable)
@@ -481,7 +481,16 @@ static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *o
        switch(Z_TYPE_P(offset)) {
        case IS_STRING:
        case IS_UNICODE:
-               return zend_u_symtable_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1);
+               if (check_empty) {
+                       zval **tmp;
+                       HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
+                       if (zend_u_hash_find(ht, Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1, (void **) &tmp) != FAILURE && zend_is_true(*tmp)) {
+                               return 1;
+                       }
+                       return 0;
+               } else {
+                       return zend_u_symtable_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_TYPE_P(offset), Z_UNIVAL_P(offset), Z_UNILEN_P(offset)+1);
+               }
        case IS_DOUBLE:
        case IS_RESOURCE:
        case IS_BOOL: 
@@ -491,7 +500,16 @@ static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *o
                } else {
                        index = Z_LVAL_P(offset);
                }
-               return zend_hash_index_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), index);
+               if (check_empty) {
+                       zval **tmp;
+                       HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
+                       if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE && zend_is_true(*tmp)) {
+                               return 1;
+                       }
+                       return 0;
+               } else {
+                       return zend_hash_index_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), index);
+               }
        default:
                zend_error(E_WARNING, "Illegal offset type");
        }
diff --git a/ext/spl/tests/bug40036.phpt b/ext/spl/tests/bug40036.phpt
new file mode 100644 (file)
index 0000000..8569629
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--
+Bug #40036 (empty() does not work correctly with ArrayObject when using ARRAY_AS_PROPS)
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+class View extends ArrayObject
+{
+    public function __construct(array $array = array())
+    {
+        parent::__construct($array, ArrayObject::ARRAY_AS_PROPS);
+    }
+}
+
+$view = new View();
+$view->foo = false;
+$view->bar = null;
+$view->baz = '';
+if (empty($view['foo']) || empty($view->foo)) {
+    echo "View::foo empty\n";
+}
+if (empty($view['bar']) || empty($view->bar)) {
+    echo "View::bar empty\n";
+}
+if (empty($view['baz']) || empty($view->baz)) {
+    echo "View::baz empty\n";
+}
+?>
+===DONE===
+--EXPECT--
+View::foo empty
+View::bar empty
+View::baz empty
+===DONE===
index 66233737271d7a7c2f355be9d1d7969d691f1f1e..54fb5665cbe205f6d5634c70cbd6062e7aa0d5ea 100644 (file)
@@ -106,7 +106,7 @@ static PHP_INI_MH(OnSetPrecision)
                return SUCCESS;
        } else {
                return FAILURE;
-}
+       }
 }
 /* }}} */
 
@@ -1012,10 +1012,15 @@ static long stream_fteller_for_zend(void *handle TSRMLS_DC)
 }
 
 static int php_stream_open_for_zend(const char *filename, zend_file_handle *handle TSRMLS_DC)
+{
+       return php_stream_open_for_zend_ex(filename, handle, ENFORCE_SAFE_MODE|USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC);
+}
+
+PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *handle, int mode TSRMLS_DC)
 {
        php_stream *stream;
 
-       stream = php_stream_open_wrapper((char *)filename, "rb", USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE, &handle->opened_path);
+       stream = php_stream_open_wrapper((char *)filename, "rb", mode, &handle->opened_path);
 
        if (stream) {
                handle->type = ZEND_HANDLE_STREAM;
@@ -1034,7 +1039,6 @@ static int php_stream_open_for_zend(const char *filename, zend_file_handle *hand
        return FAILURE;
 }
 
-
 /* {{{ php_get_configuration_directive_for_zend
  */
 static int php_get_configuration_directive_for_zend(char *name, uint name_length, zval *contents)
index 757cdc184c5bc594ead6eb78da5180a717c12d39..ee0fb8c5bff3285d39c7641d23d349a351c6501d 100644 (file)
@@ -47,6 +47,7 @@ PHPAPI void php_handle_aborted_connection(void);
 PHPAPI int php_handle_auth_data(const char *auth TSRMLS_DC);
 
 PHPAPI void php_html_puts(const char *str, uint siz TSRMLS_DC);
+PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *handle, int mode TSRMLS_DC);
 
 extern void php_call_shutdown_functions(TSRMLS_D);
 extern void php_free_shutdown_functions(TSRMLS_D);