Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

INTERNAL: Set MEMCACHED_MAX_KEY to the key length, not the memory size #358

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading