Fix for bad key on master
author <brian@gir-3.local> <>
Mon, 30 Jun 2008 17:48:50 +0000 (10:48 -0700)
committer <brian@gir-3.local> <>
Mon, 30 Jun 2008 17:48:50 +0000 (10:48 -0700)
ChangeLog
libmemcached/memcached_get.c
libmemcached/memcached_key.c
tests/function.c

index d5c8734fc2976936267895c0b6c047d168b86d51..f170e0c3c7621d0717b2218ac59c5fbf8276c6b1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+  * Fix where master key was no being checked for "bad key"
   * Fixed bugs in stats output (thread output was wrong)
   * Clarified MEMCACHED_BAD_KEY_PROVIDED is return for bad prefix key.
 
index 34fcb4ea974a1ad2729e000ff2fac2624558d160..670b2550b52c9ece3c99854e112f7c03f6dde647 100644 (file)
@@ -134,7 +134,11 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
   }
 
   if (master_key && master_key_length)
+  {
+    if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&master_key, &master_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
+      return MEMCACHED_BAD_KEY_PROVIDED;
     master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
+  }
 
   /* 
     Here is where we pay for the non-block API. We need to remove any data sitting
index ef1fe15fb47695adc0e7495de53572fab5ab5199..4ea63919f0552f25d823284d820dcd713ea8e854 100644 (file)
@@ -8,7 +8,7 @@ memcached_return memcachd_key_test(char **keys, size_t *key_length,
   for (x= 0; x < number_of_keys; x++)
   {
     int y;
-    for (y= 0; y < key_length[x]; y++)
+    for (y= 0; y < *(key_length + x); y++)
     {
       if ((isgraph(keys[x][y])) == 0)
         return MEMCACHED_BAD_KEY_PROVIDED;
index fb2f4bca42cd7caff2c898f7988f6296172e2f9e..75c28490d52055b6edc49022367c6495601b5e94 100644 (file)
@@ -566,7 +566,8 @@ test_return bad_key_test(memcached_st *memc)
   clone= memcached_clone(NULL, memc);
   assert(clone);
 
-  (void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+  rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+  assert(rc == MEMCACHED_SUCCESS);
 
   string= memcached_get(clone, key, strlen(key),
                         &string_length, &flags, &rc);
@@ -575,13 +576,29 @@ test_return bad_key_test(memcached_st *memc)
   assert(!string);
 
   set= 0;
-  (void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+  rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+  assert(rc == MEMCACHED_SUCCESS);
   string= memcached_get(clone, key, strlen(key),
                         &string_length, &flags, &rc);
   assert(rc == MEMCACHED_NOTFOUND);
   assert(string_length ==  0);
   assert(!string);
 
+  /* Test multi key for bad keys */
+  {
+    char *keys[] = { "GoodKey", "Bad Key", "NotMine" };
+    size_t key_lengths[] = { 7, 7, 7 };
+    set= 1;
+    rc= memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
+    assert(rc == MEMCACHED_SUCCESS);
+
+    rc= memcached_mget(clone, keys, &key_lengths, 3);
+    assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+
+    rc= memcached_mget_by_key(clone, "foo daddy", 9, keys, &key_lengths, 1);
+    assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+  }
+
   memcached_free(clone);
 
   return 0;