Make WordPress Core

Changeset 51916


Ignore:
Timestamp:
10/18/2021 12:51:00 PM (3 years ago)
Author:
hellofromTonya
Message:

Cron: Fix malformed cron array in wp_schedule_single_event() when _get_cron_array() returns false.

In wp_schedule_single_event(), the cron info array is retrieved via a call to _get_cron_array() and straight away cast to an array. But as the documentation for that function (correctly) states, the return type of that function is array|false, where false is returned for a site where no cron jobs have been scheduled (yet).

In the case that _get_cron_array() would return false, this would now unintentionally create an array with a single entry with key 0 and as the value false.

This is a bug. Fixed now by adding validation to the output of _get_cron_array() and initializing $crons to an empty array if false was returned.

Tests added first to prove the bug (a) was introduced in #44818 [44917] and (b) is now fixed.

Follow-up to [44917].

Props jrf, peterwilsoncc.
Fixes #53950.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/cron.php

    r51695 r51916  
    119119     * are considered duplicates.
    120120     */
    121     $crons     = (array) _get_cron_array();
     121    $crons = _get_cron_array();
     122    if ( ! is_array( $crons ) ) {
     123        $crons = array();
     124    }
     125
    122126    $key       = md5( serialize( $event->args ) );
    123127    $duplicate = false;
  • trunk/tests/phpunit/tests/cron.php

    r51657 r51916  
    101101    }
    102102
    103 
    104103    /**
    105104     * Tests that a call to wp_schedule_event() on a site without any scheduled events
     
    124123        // Add an event.
    125124        $this->assertTrue( wp_schedule_event( $timestamp, 'daily', $hook ) );
     125    }
     126
     127    /**
     128     * Tests that a call to wp_schedule_single_event() on a site without any scheduled events
     129     * does not result in the value "false" being added into the cron array.
     130     *
     131     * @ticket 53950
     132     *
     133     * @covers ::wp_schedule_single_event
     134     */
     135    function test_wp_schedule_single_event_without_cron_option() {
     136        delete_option( 'cron' );
     137
     138        // Verify that the cause of the error is in place.
     139        $this->assertFalse( _get_cron_array(), '_get_cron_array() does not return false' );
     140
     141        $hook      = __FUNCTION__;
     142        $timestamp = strtotime( '+10 minutes' );
     143
     144        // Add an event.
     145        $this->assertTrue( wp_schedule_single_event( $timestamp, $hook ), 'Scheduling single event failed' );
     146
     147        // Verify that "false" is not a value in the final cron array.
     148        $this->assertNotContains( false, get_option( 'cron' ), 'Resulting cron array contains the value "false"' );
    126149    }
    127150
Note: See TracChangeset for help on using the changeset viewer.