Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SC_Helper_HandleError で定義前の ERROR_LOG_REALFILE が使われることがある #808 #809

Merged
merged 1 commit into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading