MEMCACHED_BAD_KEY_PROVIDED has been added as an error type. When libmemcached
author <brian@gir-2.local> <>
Wed, 13 Feb 2008 09:38:41 +0000 (15:08 +0530)
committer <brian@gir-2.local> <>
Wed, 13 Feb 2008 09:38:41 +0000 (15:08 +0530)
is compiled in debug mode it can toss an error if a bad key is provided.

ChangeLog
include/memcached.h
lib/Makefile.am
lib/common.h
lib/memcached_auto.c
lib/memcached_get.c
lib/memcached_storage.c
lib/memcached_strerror.c
tests/function.c

index 55dff5f436f09917002b112e36880eb1a6f269a6..59a6f932db05e141206afb78b604d6a4ceccf1b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,9 @@
   * Servers are now sorted, meaning that servers are now ordered so that
     clients with the same lists, will have same distribution. (Idea from
     Ross McFarland).
+  * Added MEMCACHED_BAD_KEY_PROVIDED error for auto, set, and get operations 
+    when the library is compiled with --enable-debug. This additional code
+    will test for bad keys.
   
 0.15 Tue Jan 29 14:55:44 PST 2008
   * More work on the C++ API.
index 095ac4351a10221a7c94e625ccaa4820c29593a0..fa2d305cd98e6d4497bf623f715c00d9d83e8675 100644 (file)
@@ -67,6 +67,7 @@ typedef enum {
   MEMCACHED_FETCH_NOTFINISHED,
   MEMCACHED_TIMEOUT,
   MEMCACHED_BUFFERED,
+  MEMCACHED_BAD_KEY_PROVIDED,
   MEMCACHED_MAXIMUM_RETURN, /* Always add new error code before */
 } memcached_return;
 
index 5589e3b967423bdf4139d912779b48196d6f637c..0783bcf43d2fe2fcc178576622583eeecc7b4ca0 100644 (file)
@@ -43,6 +43,7 @@ libmemcached_la_SOURCES = crc.c \
                          memcached_hosts.c \
                          memcached_io.c \
                          md5.c \
+                         memcached_key.c \
                          memcached_quit.c \
                          memcached_parse.c \
                          memcached_response.c \
index 3c707143e9bbdc9bc275448300c0c3941f4d04cd..610d432043dfbd8eaf2e7a32f88b1054e8ad885a 100644 (file)
@@ -21,7 +21,7 @@
 #include <fcntl.h>
 #include <sys/un.h>
 #include <netinet/tcp.h>
-#include "libmemcached_config.h"
+#include <libmemcached_config.h>
 
 #if TIME_WITH_SYS_TIME
 # include <sys/time.h>
@@ -110,5 +110,13 @@ memcached_return value_fetch(memcached_server_st *ptr,
                              memcached_result_st *result);
 void server_list_free(memcached_st *ptr, memcached_server_st *servers);
 
+memcached_return key_proof(char **keys, size_t *key_length, 
+                           unsigned int number_of_keys);
+
+#ifdef HAVE_DEBUG
+#define key_test(A,B,C) key_proof(A,B,C)
+#else
+#define key_test(A,B,C) MEMCACHED_SUCCESS
+#endif
 
 #endif /* __COMMON_H__ */
index 4af85e97bd385d56951aed7b192022482f23119b..36780dc5409f3dee8dc5151cf1c8dc1ed96cd06a 100644 (file)
@@ -17,6 +17,9 @@ static memcached_return memcached_auto(memcached_st *ptr,
   if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
+  if (key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
+    return MEMCACHED_BAD_KEY_PROVIDED;
+
   server_key= memcached_generate_hash(ptr, key, key_length);
 
   send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
index 8c3180ab9caf7e39ea7e43815e34d2354bfe7424..cfbb13f43dfb40419a9db32bcd7c6217fa195cd7 100644 (file)
@@ -75,6 +75,9 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
+  if (key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED)
+    return MEMCACHED_BAD_KEY_PROVIDED;
+
   if (ptr->flags & MEM_SUPPORT_CAS)
   {
     get_command= "gets ";
index d8b124325aafb4c08270f0cadae4f423aa85e8bc..30585095fa9b8588b5e4cc3026217111702cd7c3 100644 (file)
@@ -66,6 +66,9 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
+  if (key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
+    return MEMCACHED_BAD_KEY_PROVIDED;
+
   server_key= memcached_generate_hash(ptr, master_key, master_key_length);
 
   if (cas)
index 8b8438bbf8c556a5636930835c5a502af59ef5d7..3271682d2fdfeed1b902e674d5306a674248c826 100644 (file)
@@ -68,6 +68,8 @@ char *memcached_strerror(memcached_st *ptr, memcached_return rc)
     return "ACTION QUEUED";
   case MEMCACHED_TIMEOUT:
     return "A TIMEOUT OCCURRED";
+  case MEMCACHED_BAD_KEY_PROVIDED:
+    return "A BAD KEY WAS PROVIDED/CHARACTERS OUT OF RANGE";
   case MEMCACHED_MAXIMUM_RETURN:
     return "Gibberish returned!";
   default:
index 0ead1435299c078d4c214addd266413c8f10895a..1534019cb16fbeb100d131c6db983c54bded2501 100644 (file)
@@ -457,6 +457,25 @@ uint8_t flush_test(memcached_st *memc)
   return 0;
 }
 
+uint8_t bad_key_test(memcached_st *memc)
+{
+#ifdef HAVE_DEBUG
+  memcached_return rc;
+  char *key= "foo bad";
+  char *string;
+  size_t string_length;
+  uint32_t flags;
+
+  string= memcached_get(memc, key, strlen(key),
+                        &string_length, &flags, &rc);
+  assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
+  assert(string_length ==  0);
+  assert(!string);
+#endif
+
+  return 0;
+}
+
 uint8_t get_test(memcached_st *memc)
 {
   memcached_return rc;
@@ -2361,6 +2380,7 @@ test_st tests[] ={
   {"behavior_test", 0, get_stats_keys },
   {"callback_test", 0, get_stats_keys },
   {"version_string_test", 0, version_string_test},
+  {"bad_key", 1, bad_key_test },
   {0, 0, 0}
 };