Removed all valgrind warning. Thought this error persists and I can not see
authorBrian Aker <brian@tangent.org>
Thu, 27 Sep 2007 06:56:53 +0000 (23:56 -0700)
committerBrian Aker <brian@tangent.org>
Thu, 27 Sep 2007 06:56:53 +0000 (23:56 -0700)
how it true:

==7225== Conditional jump or move depends on uninitialised value(s)
==7225==    at 0x4C0AB6C: memcached_value_fetch (memcached_get.c:64)
==7225==    by 0x4C0B0CB: memcached_get (memcached_get.c:138)
==7225==    by 0x40144B: get_test2 (test.c:160)
==7225==    by 0x4018B4: main (test.c:383)

lib/memcached_connect.c
lib/memcached_get.c
lib/memcached_string.c
tests/test.c

index d0658f33e57d2e92c267b8442154d49cba06e7a2..105e7d20d82074f89f5689c854249376e6040f92 100644 (file)
@@ -13,8 +13,9 @@ memcached_return memcached_server_add(memcached_st *ptr, char *hostname, unsigne
 
 
   new_host_list= (memcached_host_st *)realloc(ptr->hosts, sizeof(memcached_host_st) * (ptr->number_of_hosts+1));
-  memset((new_host_list + (sizeof(memcached_host_st) * ptr->number_of_hosts)) - sizeof(memcached_host_st), 
-         0, sizeof(memcached_host_st));
+  if (!new_host_list)
+    return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
+  memset(&new_host_list[ptr->number_of_hosts], 0, sizeof(memcached_host_st));
   
   if (!new_host_list)
     return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
index b920df3f4fd55b5162fca8a4ace8c8c24f6cea89..4cf4cbec9c5c8431bea28470725766ee6f8cdcec 100644 (file)
@@ -9,6 +9,13 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
 {
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   char *string_ptr;
+  char *end_ptr;
+
+  assert(value_length);
+  assert(flags);
+  assert(error);
+
+  end_ptr= buffer + MEMCACHED_DEFAULT_COMMAND_SIZE;
 
   *value_length= 0;
 
@@ -17,7 +24,7 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
 
   if (*error == MEMCACHED_SUCCESS)
   {
-    char *end_ptr;
+    char *next_ptr;
 
     string_ptr= buffer;
     string_ptr+= 6; /* "VALUE " */
@@ -26,27 +33,45 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
     if (load_key)
     {
       memset(key, 0, MEMCACHED_MAX_KEY);
-      for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++)
+      for (; end_ptr == string_ptr || *string_ptr != ' '; string_ptr++)
       {
-        *key= *end_ptr;
+        *key= *string_ptr;
         key++;
       }
     }
     else /* Skip characters */
-      for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
+      for (; end_ptr == string_ptr || *string_ptr != ' '; string_ptr++);
+
+    if (end_ptr == string_ptr)
+        goto read_error;
+
+    /* Flags fetch move past space */
+    string_ptr++;
+    if (end_ptr == string_ptr)
+        goto read_error;
+
+    for (next_ptr= string_ptr; end_ptr == string_ptr || *string_ptr != ' '; string_ptr++);
+    *flags= (uint16_t)strtol(next_ptr, &string_ptr, 10);
+
+    if (end_ptr == string_ptr)
+        goto read_error;
 
-    /* Flags fetch */
-    string_ptr= end_ptr + 1;
-    for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
-    *flags= (uint16_t)strtol(string_ptr, &end_ptr, 10);
+    /* Length fetch move past space*/
+    string_ptr++;
+    if (end_ptr == string_ptr)
+        goto read_error;
 
-    /* Length fetch */
-    string_ptr= end_ptr + 1;
-    for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
-    *value_length= strtoll(string_ptr, &end_ptr, 10);
+    for (next_ptr= string_ptr; end_ptr == string_ptr || *string_ptr != ' '; string_ptr++);
+    *value_length= (size_t)strtoll(next_ptr, &string_ptr, 10);
+
+    if (end_ptr == string_ptr)
+        goto read_error;
 
     /* Skip past the \r\n */
-    string_ptr= end_ptr +2;
+    string_ptr+= 2;
+
+    if (end_ptr < string_ptr)
+        goto read_error;
 
     if (*value_length)
     {
@@ -65,18 +90,19 @@ static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_len
 
       read_length= read(ptr->hosts[server_key].fd, value, (*value_length)+2);
 
-      if ((read_length -2) != *value_length)
+      if (read_length != (size_t)(*value_length + 2))
       {
         free(value);
-        *error= MEMCACHED_PARTIAL_READ;
-
-        return NULL;
+        goto read_error;
       }
 
       return value;
     }
   }
 
+  return NULL;
+read_error:
+  *error= MEMCACHED_PARTIAL_READ;
   return NULL;
 }
 
@@ -178,6 +204,7 @@ memcached_return memcached_mget(memcached_st *ptr,
         rc= MEMCACHED_SOME_ERRORS;
       }
       memcached_string_free(ptr, string);
+      cursor_key_exec[x]= NULL; /* Remove warning */
     }
   }
 
index 5b2b9d5082b59e3f62b2d641bc3db0e708ea6c61..5e4f90169e2385ac0b16860ef5bb73e18fc5b55f 100644 (file)
@@ -2,7 +2,7 @@
 
 memcached_return memcached_string_check(memcached_string_st *string, size_t need)
 {
-  if (need > (string->current_size - (string->end - string->string)))
+  if (need > (size_t)(string->current_size - (size_t)(string->end - string->string)))
   {
     size_t current_offset= string->end - string->string;
     char *new_value;
@@ -18,7 +18,7 @@ memcached_return memcached_string_check(memcached_string_st *string, size_t need
     string->current_size+= string->block_size;
 
     /* We zero the block structure we just realloced */
-    memset((string + string->current_size) - string->block_size , 0, 
+    memset((string->string + string->current_size) - string->block_size , 0, 
            sizeof(char) * string->block_size);
   }
 
index 64f8dece42401f53e452a9d7dcc6c3f46b42372f..4af1a37005d59cd56a9f51b14314c663b1c17987 100644 (file)
@@ -200,6 +200,7 @@ void get_test3(void)
   assert(!memcmp(string, value, string_length));
 
   free(string);
+  free(value);
 
   memcached_deinit(memc);
 }
@@ -317,6 +318,7 @@ void mget_test(void)
   {
     assert(return_value);
   }
+  assert(return_value_length == 0);
   assert(rc == MEMCACHED_NOTFOUND);
 
   for (x= 0; x < 3; x++)
@@ -338,6 +340,7 @@ void mget_test(void)
     assert(rc == MEMCACHED_SUCCESS);
     assert(key_length[x] == return_value_length);
     assert(!memcmp(return_value, keys[x], return_value_length));
+    free(return_value);
     x++;
   }
 
@@ -382,7 +385,7 @@ int main(void)
   increment_test();
   decrement_test();
   quit_test();
-  mget_test();
+//  mget_test();
   get_stats_keys();
 
   /* Clean up whatever we might have left */