Bug #75790 | memcahced SET command accepts negative values for expire time | ||
---|---|---|---|
Submitted: | 5 Feb 2015 10:08 | Modified: | 23 Mar 2015 14:11 |
Reporter: | Umesh Shastry | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Memcached | Severity: | S2 (Serious) |
Version: | 5.7.6, 5.6.24 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[5 Feb 2015 10:08]
Umesh Shastry
[13 Feb 2015 8:38]
MySQL Verification Team
// with 5.6.24 // from CLI session ( cache only policy) [umshastr@hod03]/export/umesh/mysql-5.6.24: bin/mysql -uroot -p -S /tmp/mysql_ushastry.sock < share/innodb_memcached_config.sql Enter password: [umshastr@hod03]/export/umesh/mysql-5.6.24: bin/mysql -uroot -p -S /tmp/mysql_ushastry.sock Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15 Server version: 5.6.24-enterprise-commercial-advanced MySQL Enterprise Server - Advanced Edition (Commercial) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> install plugin daemon_memcached soname "libmemcached.so"; Query OK, 0 rows affected (0.00 sec) mysql> update innodb_memcache.cache_policies set get_policy='cache_only',set_policy='cache_only',delete_policy='cache_only',flush_policy='cache_only'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> uninstall plugin daemon_memcached; Query OK, 0 rows affected (2.00 sec) mysql> install plugin daemon_memcached soname "libmemcached.so"; Query OK, 0 rows affected (0.00 sec) mysql> select * from innodb_memcache.cache_policies; +--------------+------------+------------+---------------+--------------+ | policy_name | get_policy | set_policy | delete_policy | flush_policy | +--------------+------------+------------+---------------+--------------+ | cache_policy | cache_only | cache_only | cache_only | cache_only | +--------------+------------+------------+---------------+--------------+ 1 row in set (0.00 sec) // from telnet session [umshastr@hod03]/export/umesh/mysql-5.7.6: telnet localhost 11211 Trying ::1... Connected to localhost. Escape character is '^]'. set k 0 -60 1 v STORED get k VALUE k 0 1 v END set k 0 -90000 1 v STORED get k VALUE k 0 1 v END // ( with innodb only policy) mysql> update innodb_memcache.cache_policies set get_policy='innodb_only',set_policy='innodb_only',delete_policy='innodb_only',flush_policy='innodb_only'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> uninstall plugin daemon_memcached; Query OK, 0 rows affected (2.00 sec) mysql> install plugin daemon_memcached soname "libmemcached.so"; Query OK, 0 rows affected (0.00 sec) mysql> select * from innodb_memcache.cache_policies; +--------------+-------------+-------------+---------------+--------------+ | policy_name | get_policy | set_policy | delete_policy | flush_policy | +--------------+-------------+-------------+---------------+--------------+ | cache_policy | innodb_only | innodb_only | innodb_only | innodb_only | +--------------+-------------+-------------+---------------+--------------+ 1 row in set (0.00 sec) [umshastr@hod03]/export/umesh/mysql-5.7.6: telnet localhost 11211 Trying ::1... Connected to localhost. Escape character is '^]'. set k 0 -60 1 v STORED get k VALUE k 0 1 v END set k 0 -25000000 1 v STORED get k VALUE k 0 1 v END // from cli mysql> select * from test.demo_test; +----+--------------+------+------+-----------+ | c1 | c2 | c3 | c4 | c5 | +----+--------------+------+------+-----------+ | AA | HELLO, HELLO | 8 | 0 | 0 | | k | v | 0 | 4 | -25000000 | +----+--------------+------+------+-----------+ 2 rows in set (0.00 sec)
[23 Feb 2015 11:26]
MySQL Verification Team
Confirmed that 5.6 is also affected(included 5.6.24 in version). Thanks, Umesh
[23 Mar 2015 14:11]
Daniel Price
Posted by developer: Fixed as of the upcoming 5.6.25, 5.7.8, 5.8.0 releases, and here's the changelog entry: The "memcached" "set" command permitted a negative expire time value. Expire time is stored internally as an unsigned integer. A negative value would be converted to a large number and accepted. The maximum expire time value is now restricted to "INT_MAX32" to prevent negative expire time values. Thank you for the bug report.
[23 Mar 2015 14:11]
Daniel Price
Fixed as of the upcoming 5.6.25, 5.7.8, 5.8.0 releases, and here's the changelog entry: The "memcached" "set" command permitted a negative expire time value. Expire time is stored internally as an unsigned integer. A negative value would be converted to a large number and accepted. The maximum expire time value is now restricted to "INT_MAX32" to prevent negative expire time values. Thank you for the bug report.
[23 Jun 2015 16:20]
Laurynas Biveinis
commit 159be46cef763c5ed283cc7c2462e04336114ca2 Author: aditya <aditya.a@oracle.com> Date: Fri Mar 20 15:28:02 2015 +0530 Bug #20478242 MEMCAHCED SET COMMAND ACCEPTS NEGATIVE VALUES FOR EXPIRE TIME PROBLEM Inside memcached server the expire time is stored as unsigned int,so when the user gives a negative value it is converted to a large number and is accepted. FIX Simple and easy fix is to restrict the maximum value of expire time to INT_MAX32 since any negative value will be greater than this and we can reject it. Also removed useless assert in innodb_flush_sync_conn() function