Make WordPress Core

Changeset 56796

Timestamp:
10/06/2023 04:31:22 PM (10 months ago)
Author:
flixos90
Message:

Options, Meta APIs: Fix bug with update_option() updating the wrong cache, leading to potentially stale values being returned.

When using the $autoload parameter of update_option() alongside an option value update, prior to this changeset the function would update the incorrect cache, not respecting the new autoload value. This could have severe implications such as returning a stale option value when the option in fact had already been deleted.

This changeset fixes the bug alongside test coverage that failed with trunk but now passes.

Props kkmuffme, pentatonicfunk, SergeyBiryukov, oglekler, azaozz, spacedmonkey, nicolefurlan, joemcgill, flixos90.
Fixes #51352.

Location:
trunk
Files:
2 edited

Legend:

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

    r56788 r56796  
    860860
    861861    if ( ! wp_installing() ) {
    862         $alloptions = wp_load_alloptions( true );
    863         if ( isset( $alloptions[ $option ] ) ) {
     862        if ( ! isset( $update_args['autoload'] ) ) {
     863            // Update the cached value based on where it is currently cached.
     864            $alloptions = wp_load_alloptions( true );
     865            if ( isset( $alloptions[ $option ] ) ) {
     866                $alloptions[ $option ] = $serialized_value;
     867                wp_cache_set( 'alloptions', $alloptions, 'options' );
     868            } else {
     869                wp_cache_set( $option, $serialized_value, 'options' );
     870            }
     871        } elseif ( 'yes' === $update_args['autoload'] ) {
     872            // Delete the individual cache, then set in alloptions cache.
     873            wp_cache_delete( $option, 'options' );
     874
     875            $alloptions = wp_load_alloptions( true );
    864876            $alloptions[ $option ] = $serialized_value;
    865877            wp_cache_set( 'alloptions', $alloptions, 'options' );
    866878        } else {
     879
     880
     881
     882
     883
     884
     885
    867886            wp_cache_set( $option, $serialized_value, 'options' );
    868887        }
  • trunk/tests/phpunit/tests/option/option.php

    r56788 r56796  
    778778        $this->assertSame( 10, has_filter( 'pre_option_foo', '__return_zero' ) );
    779779    }
     780
     781
     782
     783
     784
     785
     786
     787
     788
     789
     790
     791
     792
     793
     794
     795
     796
     797
     798
     799
     800
     801
     802
     803
     804
     805
     806
     807
     808
     809
     810
     811
    780812}
Note: See TracChangeset for help on using the changeset viewer.