]> granicus.if.org Git - php/commitdiff
MFH: - Fixed bug #47769 (Strange extends PDO)
authorFelipe Pena <felipe@php.net>
Thu, 26 Mar 2009 12:53:39 +0000 (12:53 +0000)
committerFelipe Pena <felipe@php.net>
Thu, 26 Mar 2009 12:53:39 +0000 (12:53 +0000)
NEWS
ext/pdo/pdo_dbh.c
ext/pdo/tests/bug47769.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index fef74ba1caff8fb5eac4c7f808deb79ceb2f9d77..4d48cd9682fab7501281c136d42c39385c84e15d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ PHP                                                                        NEWS
   (Matteo)
 - Fixed bug #47771 (Exception during object construction from arg call calls
   object's destructor). (Dmitry)
+- Fixed bug #47769 (Strange extends PDO). (Felipe)
 - Fixed bug #47714 (autoloading classes inside exception_handler leads to
   crashes). (Dmitry)
 - Fixed bug #47699 (autoload and late static binding). (Dmitry)
index 8f443b063684c9df6069b455000034d7613b4ece..ef4d6a8b58d84b69ce822d9c502c920395d9874e 100755 (executable)
@@ -1333,7 +1333,7 @@ static union _zend_function *dbh_method_get(
        lc_method_name = emalloc(method_len + 1);
        zend_str_tolower_copy(lc_method_name, method_name, method_len);
 
-       if (zend_hash_find(&dbh->ce->function_table, lc_method_name, method_len+1, (void**)&fbc) == FAILURE) {
+       if ((fbc = std_object_handlers.get_method(object_pp, method_name, method_len TSRMLS_CC)) == NULL) {
                /* not a pre-defined method, nor a user-defined method; check
                 * the driver specific methods */
                if (!dbh->cls_methods[PDO_DBH_DRIVER_METHOD_KIND_DBH]) {
@@ -1346,23 +1346,13 @@ static union _zend_function *dbh_method_get(
 
                if (zend_hash_find(dbh->cls_methods[PDO_DBH_DRIVER_METHOD_KIND_DBH],
                                lc_method_name, method_len+1, (void**)&fbc) == FAILURE) {
-
                        if (!fbc) {
                                fbc = NULL;
                        }
-
-                       goto out;
                }
-               /* got it */
        }
 
 out:
-       if (!fbc) {
-               if (std_object_handlers.get_method) {
-                       fbc = std_object_handlers.get_method(object_pp, method_name, method_len TSRMLS_CC);
-               }
-       }
-
        efree(lc_method_name);
        return fbc;
 }
diff --git a/ext/pdo/tests/bug47769.phpt b/ext/pdo/tests/bug47769.phpt
new file mode 100644 (file)
index 0000000..d3e49ae
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #47769 (Strange extends PDO)
+--FILE--
+<?php
+
+class test extends PDO
+{
+       protected function isProtected() {
+               echo "this is a protected method.\n";
+       }
+       private function isPrivate() {
+               echo "this is a private method.\n";
+       }
+    
+    public function quote($str, $paramtype = NULL) {
+       $this->isProtected();
+       $this->isPrivate();
+       print $str ."\n";
+       }
+}
+
+$test = new test('sqlite:memory');
+$test->quote('foo');
+$test->isProtected();
+
+?>
+--EXPECTF--
+this is a protected method.
+this is a private method.
+foo
+
+Fatal error: Call to protected method test::isProtected() from context '' in %s on line %d