Skip to content

Commit 270c06b

Browse files
authored
Merge pull request #556 from rlerdorf/check_key_fix
The key length check was not taking the prefix into account
2 parents d15c2e2 + 4b5decd commit 270c06b

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

php_memcached.c

+13-1
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,18 @@ zend_bool s_memc_valid_key_binary(zend_string *key)
231231
}
232232

233233
static
234+
uint32_t s_memc_object_key_max_length(php_memc_object_t *intern) {
235+
memcached_return retval;
236+
char *result;
237+
238+
result = memcached_callback_get(intern->memc, MEMCACHED_CALLBACK_PREFIX_KEY, &retval);
239+
if (retval == MEMCACHED_SUCCESS && result) {
240+
return MEMC_OBJECT_KEY_MAX_LENGTH - strlen(result);
241+
} else {
242+
return MEMC_OBJECT_KEY_MAX_LENGTH;
243+
}
244+
}
245+
234246
zend_bool s_memc_valid_key_ascii(zend_string *key, uint64_t verify_key)
235247
{
236248
const char *str = ZSTR_VAL(key);
@@ -252,7 +264,7 @@ zend_bool s_memc_valid_key_ascii(zend_string *key, uint64_t verify_key)
252264

253265
#define MEMC_CHECK_KEY(intern, key) \
254266
if (UNEXPECTED(ZSTR_LEN(key) == 0 || \
255-
ZSTR_LEN(key) > MEMC_OBJECT_KEY_MAX_LENGTH || \
267+
ZSTR_LEN(key) > s_memc_object_key_max_length(intern) || \
256268
(memcached_behavior_get(intern->memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) \
257269
? !s_memc_valid_key_binary(key) \
258270
: !s_memc_valid_key_ascii(key, memcached_behavior_get(intern->memc, MEMCACHED_BEHAVIOR_VERIFY_KEY)) \

0 commit comments

Comments
 (0)