jenkins-bot has submitted this change and it was merged.

Change subject: database: Throw exceptions when dead mysql DB handles are used 
instead of fatals
......................................................................


database: Throw exceptions when dead mysql DB handles are used instead of fatals

Bug: T103435
Change-Id: I75c4f3a950b3b333a289d0a6a41eb4f00c292121
---
M includes/db/DatabaseMysql.php
M includes/db/DatabaseMysqlBase.php
M includes/db/DatabaseMysqli.php
3 files changed, 76 insertions(+), 23 deletions(-)

Approvals:
  Krinkle: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index 823d9b6..b69efac 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -33,10 +33,12 @@
         * @return resource False on error
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = mysql_query( $sql, $this->mConn );
+                       $ret = mysql_query( $sql, $conn );
                } else {
-                       $ret = mysql_unbuffered_query( $sql, $this->mConn );
+                       $ret = mysql_unbuffered_query( $sql, $conn );
                }
 
                return $ret;
@@ -48,8 +50,7 @@
         * @throws DBConnectionError
         */
        protected function mysqlConnect( $realServer ) {
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard 
to track down
+               # Avoid a suppressed fatal error, which is very hard to track 
down
                if ( !extension_loaded( 'mysql' ) ) {
                        throw new DBConnectionError(
                                $this,
@@ -93,8 +94,10 @@
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
+               $conn = $this->getBindingHandle();
+
                if ( function_exists( 'mysql_set_charset' ) ) {
-                       return mysql_set_charset( $charset, $this->mConn );
+                       return mysql_set_charset( $charset, $conn );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, 
__METHOD__ );
                }
@@ -104,14 +107,18 @@
         * @return bool
         */
        protected function closeConnection() {
-               return mysql_close( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_close( $conn );
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return mysql_insert_id( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_insert_id( $conn );
        }
 
        /**
@@ -129,7 +136,9 @@
         * @return int
         */
        function affectedRows() {
-               return mysql_affected_rows( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_affected_rows( $conn );
        }
 
        /**
@@ -137,9 +146,11 @@
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return mysql_select_db( $db, $this->mConn );
+               return mysql_select_db( $db, $conn );
        }
 
        protected function mysqlFreeResult( $res ) {
@@ -183,10 +194,14 @@
        }
 
        protected function mysqlRealEscapeString( $s ) {
-               return mysql_real_escape_string( $s, $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_real_escape_string( $s, $conn );
        }
 
        protected function mysqlPing() {
-               return mysql_ping( $this->mConn );
+               $conn = $this->getBindingHandle();
+
+               return mysql_ping( $conn );
        }
 }
diff --git a/includes/db/DatabaseMysqlBase.php 
b/includes/db/DatabaseMysqlBase.php
index a189648..5f27dd7 100644
--- a/includes/db/DatabaseMysqlBase.php
+++ b/includes/db/DatabaseMysqlBase.php
@@ -1059,6 +1059,28 @@
        }
 
        /**
+        * Get the underlying binding handle, mConn
+        *
+        * Makes sure that mConn is set (disconnects and ping() failure can 
unset it).
+        * This catches broken callers than catch and ignore disconnection 
exceptions.
+        * Unlike checking isOpen(), this is safe to call inside of open().
+        *
+        * @return resource|object
+        * @throws DBUnexpectedError
+        * @since 1.26
+        */
+       protected function getBindingHandle() {
+               if ( !$this->mConn ) {
+                       throw new DBUnexpectedError(
+                               $this,
+                               'DB connection was already closed or the 
connection dropped.'
+                       );
+               }
+
+               return $this->mConn;
+       }
+
+       /**
         * @param string $oldName
         * @param string $newName
         * @param bool $temporary
diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php
index d2b5ecb..8b51d81 100644
--- a/includes/db/DatabaseMysqli.php
+++ b/includes/db/DatabaseMysqli.php
@@ -34,10 +34,12 @@
         * @return resource
         */
        protected function doQuery( $sql ) {
+               $conn = $this->getBindingHandle();
+
                if ( $this->bufferResults() ) {
-                       $ret = $this->mConn->query( $sql );
+                       $ret = $conn->query( $sql );
                } else {
-                       $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+                       $ret = $conn->query( $sql, MYSQLI_USE_RESULT );
                }
 
                return $ret;
@@ -50,8 +52,8 @@
         */
        protected function mysqlConnect( $realServer ) {
                global $wgDBmysql5;
-               # Fail now
-               # Otherwise we get a suppressed fatal error, which is very hard 
to track down
+
+               # Avoid suppressed fatal error, which is very hard to track down
                if ( !function_exists( 'mysqli_init' ) ) {
                        throw new DBConnectionError( $this, "MySQLi functions 
missing,"
                                . " have you compiled PHP with the 
--with-mysqli option?\n" );
@@ -116,8 +118,10 @@
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
-               if ( method_exists( $this->mConn, 'set_charset' ) ) {
-                       return $this->mConn->set_charset( $charset );
+               $conn = $this->getBindingHandle();
+
+               if ( method_exists( $conn, 'set_charset' ) ) {
+                       return $conn->set_charset( $charset );
                } else {
                        return $this->query( 'SET NAMES ' . $charset, 
__METHOD__ );
                }
@@ -127,14 +131,18 @@
         * @return bool
         */
        protected function closeConnection() {
-               return $this->mConn->close();
+               $conn = $this->getBindingHandle();
+
+               return $conn->close();
        }
 
        /**
         * @return int
         */
        function insertId() {
-               return (int)$this->mConn->insert_id;
+               $conn = $this->getBindingHandle();
+
+               return (int)$conn->insert_id;
        }
 
        /**
@@ -152,7 +160,9 @@
         * @return int
         */
        function affectedRows() {
-               return $this->mConn->affected_rows;
+               $conn = $this->getBindingHandle();
+
+               return $conn->affected_rows;
        }
 
        /**
@@ -160,9 +170,11 @@
         * @return bool
         */
        function selectDB( $db ) {
+               $conn = $this->getBindingHandle();
+
                $this->mDBname = $db;
 
-               return $this->mConn->select_db( $db );
+               return $conn->select_db( $db );
        }
 
        /**
@@ -289,11 +301,15 @@
         * @return string
         */
        protected function mysqlRealEscapeString( $s ) {
-               return $this->mConn->real_escape_string( $s );
+               $conn = $this->getBindingHandle();
+
+               return $conn->real_escape_string( $s );
        }
 
        protected function mysqlPing() {
-               return $this->mConn->ping();
+               $conn = $this->getBindingHandle();
+
+               return $conn->ping();
        }
 
        /**

-- 
To view, visit https://gerrit.wikimedia.org/r/221055
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I75c4f3a950b3b333a289d0a6a41eb4f00c292121
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Parent5446 <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to