Skip to content

Commit

Permalink
SectionProfiler: Do not attempt to use null values as arrays
Browse files Browse the repository at this point in the history
When SectionProfiler::getFunctionStats() is called, the 'start'
and 'end' member variables may be null if no code called the
scopedProfileIn()/scopedProfileOut() methods on this profiler instance.
This can occur, for instance, when generating the parser limit report
for wikitext that did not include expensive parser functions.

In PHP 7.4, attemping to use a null value as an array generates
a PHP Notice.[1] This patch adds a check to SectionProfiler::getFunctionStats
to verify that the 'start' value is an array before attempting to
access its keys.

---
[1] https://github.com/php/php-src/blob/php-7.4.0RC1/UPGRADING#L25

Bug: T233012
Change-Id: I2d35bfddfcc4c194aa71265e40387f2f2914e3a5
  • Loading branch information
mszabo-wikia committed Sep 16, 2019
1 parent 6ebfe85 commit 2782276
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions includes/profiler/SectionProfiler.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,15 @@ public function scopedProfileOut( ScopedCallback &$section ) {
public function getFunctionStats() {
$this->collateData();

$totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
$totalReal = max( $this->end['real'] - $this->start['real'], 0 );
$totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
if ( is_array( $this->start ) ) {
$totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
$totalReal = max( $this->end['real'] - $this->start['real'], 0 );
$totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
} else {
$totalCpu = 0;
$totalReal = 0;
$totalMem = 0;
}

$profile = [];
foreach ( $this->collated as $fname => $data ) {
Expand Down

0 comments on commit 2782276

Please sign in to comment.