Fixed problem with out of range character in key.
author <brian@h220-215-226-164.catv02.itscom.jp> <>
Mon, 3 Dec 2007 00:17:05 +0000 (09:17 +0900)
committer <brian@h220-215-226-164.catv02.itscom.jp> <>
Mon, 3 Dec 2007 00:17:05 +0000 (09:17 +0900)
ChangeLog
lib/memcached.c
lib/memcached_fetch.c
tests/function.c

index 35814be13df90939b2515a472284621790e89306..cb53ed899e4c3ff1a1da7370ed10dd079afc3860 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,7 +7,7 @@
   * Refactor of memcached_get() to use common code.
   * Change in value fetch, MEMCACHED_END is now returned when keys are no
     longer in the pipe.
-
+  * Fixed bug where key could be out of range of characters
 
 0.11 Mon Nov 26 01:05:52 PST 2007
   * Added option to memcache_behavior_set() so that poll() can be timed out.
index b474ca5d1ab0cd2253317ded470c096cc878c596..591bf1f669cf8574e2c5c03bda3f5198ff55b7f8 100644 (file)
@@ -48,7 +48,7 @@ void memcached_free(memcached_st *ptr)
 */
 memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr)
 {
-  memcached_return rc;
+  memcached_return rc= MEMCACHED_SUCCESS;
   memcached_st *new_clone;
 
   if (ptr == NULL)
index ac4f49112c51e7c88e1a348b1bedf49b78511452..b8954748735e1cd99d2cc6a4fccff382ad4fb904 100644 (file)
@@ -35,7 +35,7 @@ static memcached_return memcached_value_fetch(memcached_st *ptr, char *key, size
     {
       *key_length= 0;
 
-      for (; isalnum(*string_ptr); string_ptr++)
+      for (; isgraph(*string_ptr); string_ptr++)
       {
         *key= *string_ptr;
         key++;
@@ -43,7 +43,7 @@ static memcached_return memcached_value_fetch(memcached_st *ptr, char *key, size
       }
     }
     else /* Skip characters */
-      for (; isalnum(*string_ptr); string_ptr++);
+      for (; isgraph(*string_ptr); string_ptr++);
 
     if (end_ptr == string_ptr)
         goto read_error;
index 2450b0dd7f7cdc7f5f31170b6688ddd7db92e91f..3408296681551ccde00373cd00f3e2af0372538f 100644 (file)
@@ -1343,6 +1343,49 @@ uint8_t user_supplied_bug7(memcached_st *memc)
   return 0;
 }
 
+uint8_t user_supplied_bug9(memcached_st *memc)
+{
+  memcached_return rc;
+  char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
+  size_t key_length[3];
+  unsigned int x;
+  uint16_t flags;
+  unsigned count= 0;
+
+  char return_key[MEMCACHED_MAX_KEY];
+  size_t return_key_length;
+  char *return_value;
+  size_t return_value_length;
+
+
+  key_length[0]= strlen("UDATA:edevil@sapo.pt");
+  key_length[1]= strlen("fudge&*@#");
+  key_length[2]= strlen("for^#@&$not");
+
+
+  for (x= 0; x < 3; x++)
+  {
+    rc= memcached_set(memc, keys[x], key_length[x], 
+                      keys[x], key_length[x],
+                      (time_t)50, (uint16_t)9);
+    assert(rc == MEMCACHED_SUCCESS);
+  }
+
+  rc= memcached_mget(memc, keys, key_length, 3);
+  assert(rc == MEMCACHED_SUCCESS);
+
+  /* We need to empty the server before continueing test */
+  while ((return_value= memcached_fetch(memc, return_key, &return_key_length, 
+                      &return_value_length, &flags, &rc)) != NULL)
+  {
+    assert(return_value);
+    count++;
+  }
+  assert(count == 3);
+
+  return 0;
+}
+
 uint8_t result_static(memcached_st *memc)
 {
   memcached_result_st result;
@@ -1838,6 +1881,7 @@ test_st user_tests[] ={
   {"user_supplied_bug6", 1, user_supplied_bug6 },
   {"user_supplied_bug7", 1, user_supplied_bug7 },
   {"user_supplied_bug8", 1, user_supplied_bug8 },
+  {"user_supplied_bug9", 1, user_supplied_bug9 },
   {0, 0, 0}
 };