Skip to content

Commit

Permalink
Merge pull request #809 from seasoftjapan/seasoft-808
Browse files Browse the repository at this point in the history
SC_Helper_HandleError で定義前の ERROR_LOG_REALFILE が使われることがある #808
  • Loading branch information
ji-eunsoo authored Jan 24, 2024
2 parents 93abd50 + 5a7a693 commit 14a4cb0
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 13 deletions.
45 changes: 32 additions & 13 deletions data/class/helper/SC_Helper_HandleError.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ class SC_Helper_HandleError
/** エラー処理中か */
static $under_error_handling = false;

/** display_errors の初期値 */
static $default_display_errors;

/**
* 処理の読み込みを行う
*
Expand All @@ -51,21 +54,16 @@ public static function load()
// 開発時は -1 (全て) を推奨
error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE);

static::$default_display_errors = ini_get('display_errors');

if (!(defined('SAFE') && SAFE === true) && !(defined('INSTALL_FUNCTION') && INSTALL_FUNCTION === true)) {
// E_USER_ERROR または警告を捕捉した場合のエラーハンドラ
set_error_handler(array(__CLASS__, 'handle_warning'), E_USER_ERROR | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING);

// 実質的に PHP 5.2 以降かで処理が分かれる
if (function_exists('error_get_last')) {
// E_USER_ERROR 以外のエラーを捕捉した場合の処理用
register_shutdown_function(array(__CLASS__, 'handle_error'));
// 以降の処理では画面へのエラー表示は行なわない
ini_set('display_errors', 0);
} else {
// エラー捕捉用の出力バッファリング
ob_start(array(__CLASS__, '_fatal_error_handler'));
ini_set('display_errors', 1);
}
// E_USER_ERROR 以外のエラーを捕捉した場合の処理用
register_shutdown_function(array(__CLASS__, 'handle_error'));
// 以降の処理では画面へのエラー表示は行なわない
ini_set('display_errors', 0);
}
}

Expand All @@ -92,10 +90,22 @@ public static function handle_warning($errno, $errstr, $errfile, $errline)
return;
}

// パラメーターが読み込まれるまでは、PHP 標準のエラー処理とする。
// - phpunit の実行中に Warning が出力されることでテストが失敗するテストケースがあっため、除外している。
if (!defined('ERROR_LOG_REALFILE') && !(defined('TEST_FUNCTION') && TEST_FUNCTION === true)) {
return false;
}

$error_type_name = GC_Utils_Ex::getErrorTypeName($errno);

switch ($errno) {
case E_USER_ERROR:
// パラメーターが読み込まれるまでは、エラー例外をスローする。(上の分岐があるため phpunit の実行中に限定される。)
if (!defined('ERROR_LOG_REALFILE')) {
ini_set('display_errors', static::$default_display_errors);
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

$message = "Fatal error($error_type_name): $errstr on [$errfile($errline)]";
GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE, true);

Expand All @@ -107,8 +117,10 @@ public static function handle_warning($errno, $errstr, $errfile, $errline)
case E_USER_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
$message = "Warning($error_type_name): $errstr on [$errfile($errline)]";
GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE);
if (defined('ERROR_LOG_REALFILE')) {
$message = "Warning($error_type_name): $errstr on [$errfile($errline)]";
GC_Utils_Ex::gfPrintLog($message, ERROR_LOG_REALFILE);
}

return true;

Expand All @@ -129,6 +141,7 @@ public static function handle_warning($errno, $errstr, $errfile, $errline)
* @param string $buffer 出力バッファリングの内容
* @return string|void エラーが捕捉された場合は, エラーページへリダイレクトする;
* エラーが捕捉されない場合は, 出力バッファリングの内容を返す
* @deprecated 2.18 EC-CUBE 本体では使用していない。
*/
static function &_fatal_error_handler(&$buffer)
{
Expand Down Expand Up @@ -179,6 +192,12 @@ public static function handle_error()
return;
}

// パラメーターが読み込まれるまでは、エラー例外をスローする。
if (!defined('ERROR_LOG_REALFILE')) {
ini_set('display_errors', static::$default_display_errors);
throw new ErrorException($arrError['message'], 0, $arrError['type'], $arrError['file'], $arrError['line']);
}

$error_type_name = GC_Utils_Ex::getErrorTypeName($arrError['type']);
$errstr = "Fatal error($error_type_name): {$arrError['message']} on [{$arrError['file']}({$arrError['line']})]";

Expand Down
3 changes: 3 additions & 0 deletions tests/require.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<?php
$loader = require __DIR__.'/../data/vendor/autoload.php';

/** テスト中 */
define('TEST_FUNCTION', true);

if (strpos($_SERVER['SCRIPT_FILENAME'], 'phpunit') !== false && !class_exists('\Eccube2\Tests\Fixture\Generator')) {
echo 'You must set up the project dependencies, run the following commands:'.PHP_EOL.
'composer require nanasess/eccube2-fixture-generator --dev --ignore-platform-req=php'.PHP_EOL;
Expand Down

0 comments on commit 14a4cb0

Please sign in to comment.