SectionProfiler: Do not attempt to use null values as arrays
authorMáté Szabó <mszabo@wikia-inc.com>
Mon, 16 Sep 2019 19:30:47 +0000 (21:30 +0200)
committerMáté Szabó <mszabo@wikia-inc.com>
Mon, 16 Sep 2019 19:30:47 +0000 (21:30 +0200)
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

includes/profiler/SectionProfiler.php

index c27ab4f..92e276d 100644 (file)
@@ -96,9 +96,15 @@ class SectionProfiler {
        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 ) {