From 84c5ba6a1a55d25b82d65512ddeb69bf9f47a8d0 Mon Sep 17 00:00:00 2001 From: Antoine Musso Date: Wed, 4 Dec 2013 18:00:21 +0100 Subject: [PATCH] media: limit size of stderr being logged Whenever a rendering commands emit a ton of errors (spotted a case generating 125MB), the call to trim() makes PHP copy the stderr which might exhaust the remaining available memory. The new constant MediaHandler::MAX_ERR_LOG_SIZE = 65535 is used to substr() the error log before it get trimmed and logged. bug: 57985 Change-Id: Ibd4cf0331529d323a68273163ac230b07a6c6108 --- includes/media/MediaHandler.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php index 562de13cb2..b002dfb0a0 100644 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -31,6 +31,10 @@ abstract class MediaHandler { const METADATA_GOOD = true; const METADATA_BAD = false; const METADATA_COMPATIBLE = 2; // for old but backwards compatible. + /** + * Max length of error logged by logErrorForExternalProcess() + */ + const MAX_ERR_LOG_SIZE = 65535; /** @var MediaHandler[] Instance cache with array of MediaHandler */ protected static $handlers = array(); @@ -711,13 +715,17 @@ abstract class MediaHandler { * * @since 1.23 * @param $retval int - * @param $err int + * @param $err string Error reported by command. Anything longer than + * MediaHandler::MAX_ERR_LOG_SIZE is stripped off. * @param $cmd string */ protected function logErrorForExternalProcess( $retval, $err, $cmd ) { + # Keep error output limited (bug 57985) + $errMessage = trim( substr( $err, 0, self::MAX_ERR_LOG_SIZE ) ); + wfDebugLog( 'thumbnail', sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"', - wfHostname(), $retval, trim( $err ), $cmd ) ); + wfHostname(), $retval, $errMessage, $cmd ) ); } } -- 2.20.1