MDL-56978 core: fix error handling in min_fix_utf8
authorMark Nielsen <mark@moodlerooms.com>
Wed, 16 Nov 2016 16:59:15 +0000 (08:59 -0800)
committerMark Nielsen <mark@moodlerooms.com>
Wed, 16 Nov 2016 16:59:15 +0000 (08:59 -0800)
Must completely suppress notice from iconv as Behat's
shutdown function uses error_get_last() which is
unable to detect if the error was suppressed or not.

lib/configonlylib.php

index 72e5d51..670d69b 100644 (file)
@@ -89,18 +89,16 @@ function min_clean_param($value, $type) {
  * @return string
  */
 function min_fix_utf8($value) {
-    // Lower error reporting because glibc throws bogus notices.
-    $olderror = error_reporting();
-    if ($olderror & E_NOTICE) {
-        error_reporting($olderror ^ E_NOTICE);
-    }
-
     // No null bytes expected in our data, so let's remove it.
     $value = str_replace("\0", '', $value);
 
     static $buggyiconv = null;
     if ($buggyiconv === null) {
+        set_error_handler(function () {
+            return true;
+        });
         $buggyiconv = (!function_exists('iconv') or iconv('UTF-8', 'UTF-8//IGNORE', '100'.chr(130).'€') !== '100€');
+        restore_error_handler();
     }
 
     if ($buggyiconv) {
@@ -116,11 +114,7 @@ function min_fix_utf8($value) {
         }
 
     } else {
-        $result = iconv('UTF-8', 'UTF-8//IGNORE', $value);
-    }
-
-    if ($olderror & E_NOTICE) {
-        error_reporting($olderror);
+        $result = @iconv('UTF-8', 'UTF-8//IGNORE', $value);
     }
 
     return $result;