Skip to content

Commit 8329bdd

Browse files
committed
INTERNAL: Fix a smget handling about trimmed result without bkey
1 parent 2998b0c commit 8329bdd

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

libmemcached/fetch.cc

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ merge_smget_results(memcached_coll_smget_result_st **results,
425425
memset(result_idx, 0, 256*sizeof(size_t));
426426

427427
memcached_coll_sub_key_st *prev_sub_key = NULL;
428-
memcached_coll_sub_key_st *curr_sub_key;
428+
memcached_coll_sub_key_st *curr_sub_key = NULL;
429429

430430
size_t merged_count= 0;
431431
size_t found_count= 0;
@@ -627,7 +627,7 @@ merge_smget_results(memcached_coll_smget_result_st **results,
627627
for (size_t i=0; i<merged->trimmed_key_count; i++)
628628
{
629629
int smallest_idx= -1;
630-
int comp_result;
630+
int comp_result= 0;
631631
bool should_merge= false;
632632
for (size_t j=0; j<num_results; j++)
633633
{
@@ -666,15 +666,17 @@ merge_smget_results(memcached_coll_smget_result_st **results,
666666

667667
if (merged->value_count < merged->count)
668668
{
669-
/* compare it with the bkey of the last found element */
670-
prev_sub_key = &merged->sub_keys[merged->value_count-1];
671-
curr_sub_key = &results[smallest_idx]->trimmed_sub_keys[result_idx[smallest_idx]];
672-
if (byte_array_bkey) {
673-
comp_result= memcached_compare_two_hexadecimal(&prev_sub_key->bkey_ext,
674-
&curr_sub_key->bkey_ext);
675-
} else {
676-
comp_result= (prev_sub_key->bkey == curr_sub_key->bkey) ? 0
677-
: (prev_sub_key->bkey < curr_sub_key->bkey) ? -1 : 1;
669+
if (merged->value_count > 0) {
670+
/* compare it with the bkey of the last found element */
671+
prev_sub_key = &merged->sub_keys[merged->value_count-1];
672+
curr_sub_key = &results[smallest_idx]->trimmed_sub_keys[result_idx[smallest_idx]];
673+
if (byte_array_bkey) {
674+
comp_result= memcached_compare_two_hexadecimal(&prev_sub_key->bkey_ext,
675+
&curr_sub_key->bkey_ext);
676+
} else {
677+
comp_result= (prev_sub_key->bkey == curr_sub_key->bkey) ? 0
678+
: (prev_sub_key->bkey < curr_sub_key->bkey) ? -1 : 1;
679+
}
678680
}
679681
if (comp_result <= 0) {
680682
should_merge= true;
@@ -759,6 +761,8 @@ memcached_coll_smget_fetch_result(memcached_st *ptr,
759761
*error= MEMCACHED_MEMORY_ALLOCATION_FAILURE;
760762
break;
761763
}
764+
765+
each_result->sub_key_type = result->sub_key_type;
762766
}
763767

764768
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];

libmemcached/response.cc

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,12 @@ static void textual_switchover_peer_check(memcached_server_write_instance_st ins
255255
if (str_length < buf_length) {
256256
/* OK */
257257
memcpy(instance->switchover_peer, startptr, str_length);
258-
instance->switchover_peer[str_length]= '\0';
258+
instance->switchover_peer[str_length]= '\0';
259259
instance->switchover_sidx= -1; /* undefined */
260260
} else {
261261
/* something is wrong */
262262
memcpy(instance->switchover_peer, startptr, buf_length-1);
263-
instance->switchover_peer[buf_length-1]= '\0';
263+
instance->switchover_peer[buf_length-1]= '\0';
264264
instance->switchover_sidx= 1; /* set first slave */
265265
}
266266
}
@@ -2002,12 +2002,17 @@ static memcached_return_t textual_coll_smget_value_fetch(memcached_server_write_
20022002
/* byte array bkey : starts with 0x */
20032003
if (to_read_string[0] == '0' && to_read_string[1] == 'x')
20042004
{
2005+
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_EXT &&
2006+
result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_EXT_RANGE)
2007+
return MEMCACHED_PROTOCOL_ERROR;
20052008
memcached_conv_str_to_hex(ptr->root, to_read_string+2, read_length-2-1, &result->sub_keys[i].bkey_ext); // except '0x' and '\0'
2006-
result->sub_key_type = MEMCACHED_COLL_QUERY_BOP_EXT;
20072009
}
20082010
/* normal bkey */
20092011
else
20102012
{
2013+
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP &&
2014+
result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_RANGE)
2015+
return MEMCACHED_PROTOCOL_ERROR;
20112016
result->sub_keys[i].bkey = strtoull(to_read_string, &string_ptr, 10);
20122017
result->sub_key_type = MEMCACHED_COLL_QUERY_BOP;
20132018
}
@@ -2280,7 +2285,8 @@ static memcached_return_t textual_coll_smget_trimmed_key_fetch(memcached_server_
22802285
{
22812286
memcached_conv_str_to_hex(ptr->root, to_read_string+2, read_length-2-1,
22822287
&result->trimmed_sub_keys[i].bkey_ext); // except '0x' and '\0'
2283-
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_EXT)
2288+
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_EXT &&
2289+
result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_EXT_RANGE)
22842290
{
22852291
memcached_string_free(&result->trimmed_keys[i]);
22862292
return MEMCACHED_PROTOCOL_ERROR;
@@ -2290,7 +2296,8 @@ static memcached_return_t textual_coll_smget_trimmed_key_fetch(memcached_server_
22902296
else
22912297
{
22922298
result->trimmed_sub_keys[i].bkey = strtoull(to_read_string, &string_ptr, 10);
2293-
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP)
2299+
if (result->sub_key_type != MEMCACHED_COLL_QUERY_BOP &&
2300+
result->sub_key_type != MEMCACHED_COLL_QUERY_BOP_RANGE)
22942301
{
22952302
memcached_string_free(&result->trimmed_keys[i]);
22962303
return MEMCACHED_PROTOCOL_ERROR;

0 commit comments

Comments
 (0)