Make WordPress Core

Changeset 38699


Ignore:
Timestamp:
10/01/2016 06:27:27 AM (7 years ago)
Author:
peterwilsoncc
Message:

Meta: Improve ID casting when getting, updating or deleting meta data.

Blindly casting IDs to absolute integers in get_metadata_by_mid(), update_metadata_by_mid() and delete_metadata_by_mid() can cause unexpected behaviour when a floating or negative number is passed.

Fixes #37746.

Location:
trunk
Files:
2 edited

Legend:

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

    r38125 r38699  
    568568    global $wpdb;
    569569
    570     if ( ! $meta_type || ! is_numeric( $meta_id ) ) {
    571         return false;
    572     }
    573 
    574     $meta_id = absint( $meta_id );
    575     if ( ! $meta_id ) {
     570    if ( ! $meta_type || ! is_numeric( $meta_id ) || floor( $meta_id ) != $meta_id ) {
     571        return false;
     572    }
     573
     574    $meta_id = intval( $meta_id );
     575    if ( $meta_id <= 0 ) {
    576576        return false;
    577577    }
     
    612612
    613613    // Make sure everything is valid.
    614     if ( ! $meta_type || ! is_numeric( $meta_id ) ) {
    615         return false;
    616     }
    617 
    618     $meta_id = absint( $meta_id );
    619     if ( ! $meta_id ) {
     614    if ( ! $meta_type || ! is_numeric( $meta_id ) || floor( $meta_id ) != $meta_id ) {
     615        return false;
     616    }
     617
     618    $meta_id = intval( $meta_id );
     619    if ( $meta_id <= 0 ) {
    620620        return false;
    621621    }
     
    703703
    704704    // Make sure everything is valid.
    705     if ( ! $meta_type || ! is_numeric( $meta_id ) ) {
    706         return false;
    707     }
    708 
    709     $meta_id = absint( $meta_id );
    710     if ( ! $meta_id ) {
     705    if ( ! $meta_type || ! is_numeric( $meta_id ) || floor( $meta_id ) != $meta_id ) {
     706        return false;
     707    }
     708
     709    $meta_id = intval( $meta_id );
     710    if ( $meta_id <= 0 ) {
    711711        return false;
    712712    }
  • trunk/tests/phpunit/tests/meta.php

    r35242 r38699  
    294294
    295295    /**
     296     * @ticket 37746
     297     */
     298    function test_negative_meta_id() {
     299        $negative_mid = $this->meta_id * -1;
     300
     301        $this->assertTrue( $negative_mid < 0 );
     302        $this->assertFalse( get_metadata_by_mid( 'user', $negative_mid ) );
     303        $this->assertFalse( update_metadata_by_mid( 'user', $negative_mid, 'meta_new_value' ) );
     304        $this->assertFalse( delete_metadata_by_mid( 'user', $negative_mid ) );
     305    }
     306
     307    /**
     308     * @ticket 37746
     309     */
     310    function test_floating_meta_id() {
     311        $floating_mid = $this->meta_id + 0.1337;
     312
     313        $this->assertTrue( floor( $floating_mid ) !== $floating_mid );
     314        $this->assertFalse( get_metadata_by_mid( 'user', $floating_mid ) );
     315        $this->assertFalse( update_metadata_by_mid( 'user', $floating_mid, 'meta_new_value' ) );
     316        $this->assertFalse( delete_metadata_by_mid( 'user', $floating_mid ) );
     317    }
     318
     319    /**
     320     * @ticket 37746
     321     */
     322    function test_string_point_zero_meta_id() {
     323        $meta_id = add_metadata( 'user', $this->author->ID, 'meta_key', 'meta_value_2' );
     324
     325        $string_mid = "{$meta_id}.0";
     326
     327        $this->assertTrue( floor( $string_mid ) == $string_mid );
     328        $this->assertNotEquals( false, get_metadata_by_mid( 'user', $string_mid ) );
     329        $this->assertNotEquals( false, update_metadata_by_mid( 'user', $string_mid, 'meta_new_value_2' ) );
     330        $this->assertNotEquals( false, delete_metadata_by_mid( 'user', $string_mid ) );
     331    }
     332
     333    /**
    296334     * @ticket 15030
    297335     */
Note: See TracChangeset for help on using the changeset viewer.