Skip to content

Commit

Permalink
INTERNAL: Set MEMCACHED_MAX_KEY to the key length, not the memory size
Browse files Browse the repository at this point in the history
  • Loading branch information
ing-eoking committed Feb 12, 2025
1 parent 047cb15 commit 55f694c
Show file tree
Hide file tree
Showing 10 changed files with 40 additions and 40 deletions.
4 changes: 2 additions & 2 deletions arcus/multi_process.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ static inline void process_child(memcached_st *proxy_mc)

rc = memcached_mget(mc, keys, lengths, 20);

char key[MEMCACHED_MAX_KEY];
char key[MEMCACHED_MAX_KEY + 1];
size_t key_length;

for (i=0; i<20; i++)
Expand Down Expand Up @@ -215,7 +215,7 @@ static inline void process_child(memcached_st *proxy_mc)

rc = memcached_mget(mc, keys, lengths, 5);

char key[MEMCACHED_MAX_KEY];
char key[MEMCACHED_MAX_KEY + 1];
size_t key_length;

for (i=0; i<5; i++)
Expand Down
2 changes: 1 addition & 1 deletion docs/03-key-value-API.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ int arcus_kv_mget(memcached_st *memc)
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_SOME_ERRORS);
while (true)
{
char key[MEMCACHED_MAX_KEY];
char key[MEMCACHED_MAX_KEY + 1];
size_t key_length;
size_t value_length;
Expand Down
2 changes: 1 addition & 1 deletion libmemcached/collection_result.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
* Result structure for collection operations.
*/
struct memcached_coll_result_st {
char item_key[MEMCACHED_MAX_KEY];
char item_key[MEMCACHED_MAX_KEY + 1];
size_t key_length;

memcached_coll_type_t type;
Expand Down
2 changes: 1 addition & 1 deletion libmemcached/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ static inline memcached_return_t memcached_validate_key_length(size_t key_length
}
else
{
if (key_length >= MEMCACHED_MAX_KEY)
if (key_length > MEMCACHED_MAX_KEY)
{
return MEMCACHED_BAD_KEY_PROVIDED;
}
Expand Down
2 changes: 1 addition & 1 deletion libmemcached/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@

/* Public defines */
#define MEMCACHED_DEFAULT_PORT 11211
#define MEMCACHED_MAX_KEY 4001 /* (4000 + 1) We add one to have it null terminated */
#define MEMCACHED_MAX_KEY 4000
#define MEMCACHED_MAX_BUFFER 8196
#define MEMCACHED_MAX_HOST_SORT_LENGTH 86 /* Used for Ketama */
#define MEMCACHED_POINTS_PER_SERVER 160
Expand Down
4 changes: 2 additions & 2 deletions libmemcached/fetch.cc
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr,
bool connection_failures= false;
while ((server= memcached_io_get_readable_server(ptr)))
{
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE + MEMCACHED_MAX_KEY];
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE + MEMCACHED_MAX_KEY + 1];
*error= memcached_response(server, buffer, sizeof(buffer), result);

if (*error == MEMCACHED_IN_PROGRESS)
Expand Down Expand Up @@ -336,7 +336,7 @@ memcached_coll_fetch_result(memcached_st *ptr,
memcached_server_st *server;
while ((server= memcached_io_get_readable_server(ptr)))
{
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE + MEMCACHED_MAX_KEY];
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE + MEMCACHED_MAX_KEY + 1];
*error= memcached_coll_response(server, buffer, sizeof(buffer), result);

if (*error == MEMCACHED_IN_PROGRESS)
Expand Down
4 changes: 2 additions & 2 deletions libmemcached/hash.cc
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ static inline uint32_t _generate_hash_wrapper(const memcached_st *ptr, const cha
if (ptr->flags.hash_with_namespace)
{
size_t temp_length= memcached_array_size(ptr->_namespace) + key_length;
char temp[MEMCACHED_MAX_KEY];
char temp[MEMCACHED_MAX_KEY + 1];

if (temp_length > MEMCACHED_MAX_KEY -1)
if (temp_length > MEMCACHED_MAX_KEY)
return 0;

strncpy(temp, memcached_array_string(ptr->_namespace), memcached_array_size(ptr->_namespace));
Expand Down
34 changes: 17 additions & 17 deletions libmemcached/response.cc
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,19 @@ static memcached_return_t textual_value_fetch(memcached_server_write_instance_st
string_ptr += memcached_array_size(ptr->root->_namespace); /* prefix length */

while (!iscntrl(*string_ptr) && !isspace(*string_ptr)) {
if (key_length < MEMCACHED_MAX_KEY) {
if (key_length <= MEMCACHED_MAX_KEY) {
key[key_length]= *string_ptr;
}
key_length++;
string_ptr++;
}

if (key_length < MEMCACHED_MAX_KEY) {
if (key_length <= MEMCACHED_MAX_KEY) {
key[key_length]= 0;
result->key_length= key_length;
} else {
snprintf(key + MEMCACHED_MAX_KEY - 4, 4, "...");
result->key_length= MEMCACHED_MAX_KEY - 1;
snprintf(key + MEMCACHED_MAX_KEY - 3, 4, "...");
result->key_length= MEMCACHED_MAX_KEY;
memcached_set_error(*ptr, MEMCACHED_KEY_TOO_BIG, MEMCACHED_AT);
}
}
Expand Down Expand Up @@ -537,14 +537,14 @@ static memcached_return_t binary_read_one_response(memcached_server_write_instan
keylen -= prefix_size;
}

uint16_t read_size= keylen < MEMCACHED_MAX_KEY ? keylen : (MEMCACHED_MAX_KEY - 1);
uint16_t read_size= keylen <= MEMCACHED_MAX_KEY ? keylen : MEMCACHED_MAX_KEY;
if (memcached_failed(rc= memcached_safe_read(ptr, result->item_key, read_size)))
{
WATCHPOINT_ERROR(rc);
return MEMCACHED_UNKNOWN_READ_FAILURE;
}

if (keylen < MEMCACHED_MAX_KEY) {
if (keylen <= MEMCACHED_MAX_KEY) {
result->item_key[read_size]= 0;
result->key_length= keylen;
} else {
Expand All @@ -553,8 +553,8 @@ static memcached_return_t binary_read_one_response(memcached_server_write_instan
{
return MEMCACHED_UNKNOWN_READ_FAILURE;
}
snprintf(result->item_key + MEMCACHED_MAX_KEY - 4, 4, "...");
result->key_length= MEMCACHED_MAX_KEY - 1;
snprintf(result->item_key + MEMCACHED_MAX_KEY - 3, 4, "...");
result->key_length= MEMCACHED_MAX_KEY;
memcached_set_error(*ptr, MEMCACHED_KEY_TOO_BIG, MEMCACHED_AT);
}

Expand Down Expand Up @@ -1971,15 +1971,15 @@ static memcached_return_t textual_coll_smget_value_fetch(memcached_server_write_
memcached_return_t rrc;

char *value_ptr;
char to_read_string[MEMCACHED_MAX_KEY+1];
char to_read_string[MEMCACHED_MAX_KEY+2];

for (i=0; i<ecount; i++)
{
bool has_eflag= false;

/* <key> */
{
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY);
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+1);
if (rrc != MEMCACHED_SUCCESS)
{
fprintf(stderr, "[debug] key_fetch_error=%s\n", to_read_string);
Expand Down Expand Up @@ -2158,16 +2158,16 @@ static memcached_return_t textual_coll_smget_missed_key_fetch(memcached_server_w

for (size_t i=0; i<kcount; i++)
{
char to_read_string[MEMCACHED_MAX_KEY+2]; // +2: "\r\n"
char to_read_string[MEMCACHED_MAX_KEY+3]; // +2: "\r\n"
ssize_t read_length= 0;

/* <missed key> */
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+1);
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+2);
if (rrc != MEMCACHED_SUCCESS && rrc != MEMCACHED_END)
{
return rrc;
}
if (read_length > MEMCACHED_MAX_KEY)
if (read_length > MEMCACHED_MAX_KEY+1)
{
goto read_error;
}
Expand All @@ -2187,7 +2187,7 @@ static memcached_return_t textual_coll_smget_missed_key_fetch(memcached_server_w
{
/* <missed cause> */
/* MEMCACHED_MAX_KEY is enough length for reading cause string */
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+1);
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+2);
if (rrc != MEMCACHED_END)
{
memcached_string_free(&result->missed_keys[i]);
Expand Down Expand Up @@ -2259,18 +2259,18 @@ static memcached_return_t textual_coll_smget_trimmed_key_fetch(memcached_server_

for (size_t i=0; i<kcount; i++)
{
char to_read_string[MEMCACHED_MAX_KEY+2]; // +2: "\r\n"
char to_read_string[MEMCACHED_MAX_KEY+3]; // +2: "\r\n"
ssize_t read_length= 0;

/* <trimmed key> */
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+1);
rrc= fetch_value_header(ptr, to_read_string, &read_length, MEMCACHED_MAX_KEY+2);
if (rrc != MEMCACHED_SUCCESS)
{
if (rrc == MEMCACHED_END) /* "\r\n" is found */
rrc= MEMCACHED_PROTOCOL_ERROR;
return rrc;
}
if (read_length > MEMCACHED_MAX_KEY)
if (read_length > MEMCACHED_MAX_KEY + 1)
{
goto read_error;
}
Expand Down
2 changes: 1 addition & 1 deletion libmemcached/result.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ struct memcached_result_st {
memcached_st *root;
memcached_string_st value;
uint64_t count;
char item_key[MEMCACHED_MAX_KEY];
char item_key[MEMCACHED_MAX_KEY + 1];
struct {
bool is_allocated:1;
bool is_initialized:1;
Expand Down
24 changes: 12 additions & 12 deletions tests/mem_functions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -920,8 +920,8 @@ static test_return_t bad_key_test(memcached_st *memc)
memcached_callback_set(memc_clone, MEMCACHED_CALLBACK_NAMESPACE, NULL));

std::vector <char> longkey;
longkey.insert(longkey.end(), MEMCACHED_MAX_KEY, 'a');
test_compare(longkey.size(), size_t(MEMCACHED_MAX_KEY));
longkey.insert(longkey.end(), MEMCACHED_MAX_KEY + 1, 'a');
test_compare(longkey.size(), size_t(MEMCACHED_MAX_KEY + 1));
{
size_t string_length;
// We subtract 1
Expand Down Expand Up @@ -1301,7 +1301,7 @@ static test_return_t mget_end(memcached_st *memc)
// retrieve both via mget
test_compare(MEMCACHED_SUCCESS, memcached_mget(memc, keys, lengths, test_array_length(keys)));

char key[MEMCACHED_MAX_KEY];
char key[MEMCACHED_MAX_KEY + 1];
size_t key_length;

// this should get both
Expand Down Expand Up @@ -1867,7 +1867,7 @@ static test_return_t mget_test(memcached_st *memc)
const char *keys[]= {"fudge", "son", "food"};
size_t key_length[]= {5, 3, 4};

char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *return_value;
size_t return_value_length;
Expand Down Expand Up @@ -1927,7 +1927,7 @@ static test_return_t mget_longkey_test(memcached_st *memc)
memset(keys[x], x + '0', key_length[x]);
}

char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *return_value;
size_t return_value_length;
Expand Down Expand Up @@ -2378,7 +2378,7 @@ static test_return_t MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st *memc)
static test_return_t fetch_all_results(memcached_st *memc, unsigned int &keys_returned, const memcached_return_t expect)
{
memcached_return_t rc;
char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *return_value;
size_t return_value_length;
Expand Down Expand Up @@ -2576,7 +2576,7 @@ static test_return_t user_supplied_bug4(memcached_st *memc)

{
char *return_value;
char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
memcached_return_t rc;
size_t return_key_length;
size_t return_value_length;
Expand Down Expand Up @@ -2655,7 +2655,7 @@ static test_return_t user_supplied_bug6(memcached_st *memc)
{
const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
size_t key_length[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *value;
size_t value_length;
Expand Down Expand Up @@ -2755,7 +2755,7 @@ static test_return_t user_supplied_bug7(memcached_st *memc)
{
const char *keys= "036790384900";
size_t key_length= strlen(keys);
char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *value;
size_t value_length;
Expand Down Expand Up @@ -2801,7 +2801,7 @@ static test_return_t user_supplied_bug9(memcached_st *memc)
uint32_t flags;
unsigned count= 0;

char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *return_value;
size_t return_value_length;
Expand Down Expand Up @@ -3226,7 +3226,7 @@ static test_return_t _user_supplied_bug21(memcached_st* memc, size_t key_count)

memcached_return_t rc;
uint32_t flags;
char return_key[MEMCACHED_MAX_KEY];
char return_key[MEMCACHED_MAX_KEY + 1];
size_t return_key_length;
char *return_value;
size_t return_value_length;
Expand Down Expand Up @@ -5816,7 +5816,7 @@ static test_return_t regression_bug_490486(memcached_st *memc)
test_compare(MEMCACHED_SUCCESS, rc);

char* the_value= NULL;
char the_key[MEMCACHED_MAX_KEY];
char the_key[MEMCACHED_MAX_KEY + 1];
size_t the_key_length;
size_t the_value_length;
uint32_t the_flags;
Expand Down

0 comments on commit 55f694c

Please sign in to comment.