Skip to content

Float values are being stored as negative #500

Closed
@xPaw

Description

@xPaw

I upgraded from PHP 7.4 to 8.1 and noticed this issue where floats are being stored as negative now. I didn't upgrade memcached server. Unsure if it worked on PHP 8.0.

Previous version: php7.4-memcached 3.1.5+2.2.0-14+0~20220117.37+debian10~1.gbpc8d81e
Version: php8.1-memcached 3.1.5+2.2.0-14+0~20220117.37+debian11~1.gbpc8d81e
(deb.sury.org package)

$Memcached = new Memcached();
$Memcached->addServer( '/run/memcached/memcached.sock', 0 );
$Memcached->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_PHP);

var_dump($Memcached->set( 'testkey', 1337.123, 60 ));
var_dump($Memcached->get( 'testkey'));

var_dump($Memcached->set( 'testkey2', -400.100, 60 ));
var_dump($Memcached->get( 'testkey2'));

var_dump($Memcached->set( 'testkey3', 600, 60 ));
var_dump($Memcached->get( 'testkey3'));

var_dump($Memcached->set( 'testkey4', ['test' => 500.60], 60 ));
var_dump($Memcached->get( 'testkey4'));

Output:

bool(true)
float(-1337.123)
bool(true)
float(-400.1)
bool(true)
int(600)
bool(true)
array(1) {
  ["test"]=>
  float(500.6)
}

Seems like this problem is only observed for bare float values, and not when they're in an array.

Verified that it is being stored like this:

$ memccat --servers=/run/memcached/memcached.sock testkey
-1337.123

$ memccat --servers=/run/memcached/memcached.sock testkey4
a:1:{s:4:"test";d:500.6;}

I initially assumed it was an igbinary issue but changing to SERIALIZER_PHP still observes this issue.

strace confirms this:

socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/run/memcached/memcached.sock"}, 110) = 0
sendto(4, "set testkey 2 60 9\r\n-1337.123\r\n", 31, MSG_NOSIGNAL, NULL, 0) = 31
recvfrom(4, "STORED\r\n", 8196, MSG_NOSIGNAL, NULL, NULL) = 8

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions