Skip to content

Commit de6b9b5

Browse files
authored
Merge pull request #254 from pmmaga/fix-key-validation
Fix object key validation
2 parents 65ebcd5 + 6e32d40 commit de6b9b5

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

Diff for: php_memcached.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@
5757
#define JSON_PARSER_DEFAULT_DEPTH 512
5858
#endif
5959

60+
/****************************************
61+
Protocol parameters
62+
****************************************/
63+
#define MEMC_OBJECT_KEY_MAX_LENGTH 250
64+
6065
/****************************************
6166
Custom options
6267
****************************************/
@@ -576,7 +581,7 @@ static void php_memc_get_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
576581
MEMC_METHOD_FETCH_OBJECT;
577582
i_obj->rescode = MEMCACHED_SUCCESS;
578583

579-
if (key_len == 0 || strchr(key, ' ')) {
584+
if (key_len == 0 || key_len > MEMC_OBJECT_KEY_MAX_LENGTH || strchr(key, ' ') || strchr(key, '\n')) {
580585
i_obj->rescode = MEMCACHED_BAD_KEY_PROVIDED;
581586
RETURN_FROM_GET;
582587
}
@@ -1448,7 +1453,7 @@ static void php_memc_store_impl(INTERNAL_FUNCTION_PARAMETERS, int op, zend_bool
14481453
MEMC_METHOD_FETCH_OBJECT;
14491454
i_obj->rescode = MEMCACHED_SUCCESS;
14501455

1451-
if (key_len == 0 || strchr(key, ' ')) {
1456+
if (key_len == 0 || key_len > MEMC_OBJECT_KEY_MAX_LENGTH || strchr(key, ' ') || strchr(key, '\n')) {
14521457
i_obj->rescode = MEMCACHED_BAD_KEY_PROVIDED;
14531458
RETURN_FALSE;
14541459
}
@@ -1599,7 +1604,7 @@ static void php_memc_cas_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
15991604
MEMC_METHOD_FETCH_OBJECT;
16001605
i_obj->rescode = MEMCACHED_SUCCESS;
16011606

1602-
if (key_len == 0 || strchr(key, ' ')) {
1607+
if (key_len == 0 || key_len > MEMC_OBJECT_KEY_MAX_LENGTH || strchr(key, ' ') || strchr(key, '\n')) {
16031608
i_obj->rescode = MEMCACHED_BAD_KEY_PROVIDED;
16041609
RETURN_FALSE;
16051610
}
@@ -1717,7 +1722,7 @@ static void php_memc_delete_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key)
17171722
MEMC_METHOD_FETCH_OBJECT;
17181723
i_obj->rescode = MEMCACHED_SUCCESS;
17191724

1720-
if (key_len == 0 || strchr(key, ' ')) {
1725+
if (key_len == 0 || key_len > MEMC_OBJECT_KEY_MAX_LENGTH || strchr(key, ' ') || strchr(key, '\n')) {
17211726
i_obj->rescode = MEMCACHED_BAD_KEY_PROVIDED;
17221727
RETURN_FALSE;
17231728
}
@@ -1817,7 +1822,7 @@ static void php_memc_incdec_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool by_key,
18171822
MEMC_METHOD_FETCH_OBJECT;
18181823
i_obj->rescode = MEMCACHED_SUCCESS;
18191824

1820-
if (key_len == 0 || strchr(key, ' ')) {
1825+
if (key_len == 0 || key_len > MEMC_OBJECT_KEY_MAX_LENGTH || strchr(key, ' ') || strchr(key, '\n')) {
18211826
i_obj->rescode = MEMCACHED_BAD_KEY_PROVIDED;
18221827
RETURN_FALSE;
18231828
}

Diff for: tests/keys.phpt

+15
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,18 @@ $ascii = memc_get_instance ();
1515
var_dump ($binary->set ('binary key with spaces', 'this is a test'));
1616
var_dump ($binary->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
1717

18+
var_dump ($binary->set ('binarykeywithnewline' . PHP_EOL, 'this is a test'));
19+
var_dump ($binary->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
20+
1821
var_dump ($ascii->set ('ascii key with spaces', 'this is a test'));
1922
var_dump ($ascii->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
2023

24+
var_dump ($binary->set ('asciikeywithnewline' . PHP_EOL, 'this is a test'));
25+
var_dump ($binary->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
26+
27+
var_dump ($ascii->set (''/*empty key*/, 'this is a test'));
28+
var_dump ($ascii->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
29+
2130
var_dump ($ascii->set (str_repeat ('1234567890', 512), 'this is a test'));
2231
var_dump ($ascii->getResultCode () == Memcached::RES_BAD_KEY_PROVIDED);
2332

@@ -30,4 +39,10 @@ bool(false)
3039
bool(true)
3140
bool(false)
3241
bool(true)
42+
bool(false)
43+
bool(true)
44+
bool(false)
45+
bool(true)
46+
bool(false)
47+
bool(true)
3348
OK

0 commit comments

Comments
 (0)