From 6d3c8ee0d3b0466f5893b1a9b46e151b4339b58d Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Thu, 9 Jan 2014 14:58:20 -0800 Subject: [PATCH] Make it a bit safer to paste input to eval.php Change-Id: I0839678e3dec64a709c0fe8808329268f36486d2 --- maintenance/eval.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/maintenance/eval.php b/maintenance/eval.php index f56e91f42f..51f2cace83 100644 --- a/maintenance/eval.php +++ b/maintenance/eval.php @@ -55,7 +55,7 @@ if ( isset( $options['d'] ) ) { } $useReadline = function_exists( 'readline_add_history' ) - && Maintenance::posix_isatty( 0 /*STDIN*/ ); + && Maintenance::posix_isatty( 0 /*STDIN*/ ); if ( $useReadline ) { $historyFile = isset( $_ENV['HOME'] ) ? @@ -63,12 +63,27 @@ if ( $useReadline ) { readline_read_history( $historyFile ); } +$e = null; // PHP exception while ( ( $line = Maintenance::readconsole() ) !== false ) { + if ( $e && !preg_match( '/^(exit|die);?$/', $line ) ) { + // Internal state may be corrupted or fatals may occur later due + // to some object not being set. Don't drop out of eval in case + // lines were being pasted in (which would then get dumped to the shell). + // Instead, just absorb the remaning commands. Let "exit" through per DWIM. + echo "Exception was thrown before; please restart eval.php\n"; + continue; + } if ( $useReadline ) { readline_add_history( $line ); readline_write_history( $historyFile ); } - $val = eval( $line . ";" ); + try { + $val = eval( $line . ";" ); + } catch ( Exception $e ) { + echo "Caught exception " . get_class( $e ) . + ": {$e->getMessage()}\n" . $e->getTraceAsString() . "\n"; + continue; + } if ( wfIsHHVM() || is_null( $val ) ) { echo "\n"; } elseif ( is_string( $val ) || is_numeric( $val ) ) { -- 2.20.1