Make hookErrorHandler() only care about serious signature errors
authorAaron Schulz <aschulz@wikimedia.org>
Thu, 22 Oct 2015 00:31:18 +0000 (17:31 -0700)
committerOri Livneh <ori@wikimedia.org>
Thu, 22 Oct 2015 00:49:31 +0000 (17:49 -0700)
Previously, it would send all manor of warnings to the error
and error-json channels. This adds a lot of overhead due to
AbuseFilter parse/eval errors. By passing immediately instead
of after calling handleError(), that overhead is avoided. Since
it still passes (e.g. returns false), any default PHP warning
logging still applies.

Change-Id: I18e60c09c2a48f2e26abab5d451bb52ea4ba7961

includes/Hooks.php

index a414562..980d350 100644 (file)
@@ -232,8 +232,11 @@ class Hooks {
 
        /**
         * Handle PHP errors issued inside a hook. Catch errors that have to do
-        * with a function expecting a reference, and pass all others through to
-        * MWExceptionHandler::handleError() for default processing.
+        * with a function expecting a reference, missing arguments, or wrong argument
+        * types. Pass all others through to to the default error handler.
+        *
+        * This is useful for throwing errors for major callback invocation errors
+        * (with regard to parameter signature) which PHP just gives warnings for.
         *
         * @since 1.18
         *
@@ -243,13 +246,14 @@ class Hooks {
         * @return bool
         */
        public static function hookErrorHandler( $errno, $errstr ) {
-               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
+               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false
+                       || strpos( $errstr, 'Missing argument ' ) !== false
+                       || strpos( $errstr, ' expects parameter ' ) !== false
+               ) {
                        throw new MWHookException( $errstr, $errno );
                }
 
-               // Delegate unhandled errors to the default MW handler
-               return call_user_func_array(
-                       'MWExceptionHandler::handleError', func_get_args()
-               );
+               // Delegate unhandled errors to the default handlers
+               return false;
        }
 }