Fix for memory leak when parsing servers.
authorBrian Aker <brian@tangent.org>
Fri, 4 Mar 2011 21:53:26 +0000 (13:53 -0800)
committerBrian Aker <brian@tangent.org>
Fri, 4 Mar 2011 21:53:26 +0000 (13:53 -0800)
libmemcached/hosts.c
libmemcached/server.c
libmemcached/server_list.c
tests/mem_functions.c

index ec12c92f9813e048d9aacf887611945b7497f7ce..9723f8b628ad8c49b42d3d1d6c4388ce63e8a22d 100644 (file)
@@ -337,7 +337,9 @@ memcached_return_t memcached_server_push(memcached_st *ptr, const memcached_serv
     if ((ptr->flags.use_udp && list[x].type != MEMCACHED_CONNECTION_UDP)
             || ((list[x].type == MEMCACHED_CONNECTION_UDP)
             && ! (ptr->flags.use_udp)) )
+    {
       return MEMCACHED_INVALID_HOST_PROTOCOL;
+    }
 
     WATCHPOINT_ASSERT(list[x].hostname[0] != 0);
 
index 22bd6f54ef4b53f1cb3a53b74cd8047e4e8b009b..97b0b27c865ccdd2faf1f5728507c75a8b5dfd98 100644 (file)
@@ -115,7 +115,14 @@ void memcached_server_free(memcached_server_st *self)
 
   if (memcached_is_allocated(self))
   {
-    libmemcached_free(self->root, self);
+    if (self->root)
+    {
+      libmemcached_free(self->root, self);
+    }
+    else
+    {
+      free(self);
+    }
   }
   else
   {
index c20f8dbf9b775679131a5db0c4473d44d5682462..64b8b0c4c83ed101c0cdac2198f8863dccb882a1 100644 (file)
@@ -42,9 +42,12 @@ memcached_server_list_append_with_weight(memcached_server_list_st ptr,
     return NULL;
   }
 
-  /* TODO: Check return type */
+  /* @todo Check return type */
   memcached_server_create_with(NULL, &new_host_list[count-1], hostname, port, weight, MEMCACHED_CONNECTION_TCP);
 
+  // Handset allocated since 
+  new_host_list->options.is_allocated= true;
+
   /* Backwards compatibility hack */
   memcached_servers_set_count(new_host_list, count);
 
index b5bd08809f4266841826424e6fe95f492de28b1f..871256cf371b8661153b3a77e3637ff2e97a35be 100644 (file)
@@ -6122,6 +6122,16 @@ static test_return_t regression_bug_583031(memcached_st *unused)
     return TEST_SUCCESS;
 }
 
+// Look for memory leak
+static test_return_t regression_bug_728286(memcached_st *unused)
+{
+  (void)unused;
+  memcached_server_st *servers = memcached_servers_parse("1.2.3.4:99");
+  memcached_server_free(servers);
+
+  return TEST_SUCCESS;
+}
+
 static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
 {
   fprintf(stderr, "Iteration #%u: ", it);
@@ -6439,6 +6449,7 @@ test_st regression_tests[]= {
   {"lp:490486", 1, (test_callback_fn)regression_bug_490486 },
   {"lp:583031", 1, (test_callback_fn)regression_bug_583031 },
   {"lp:?", 1, (test_callback_fn)regression_bug_ },
+  {"lp:728286", 1, (test_callback_fn)regression_bug_728286 },
   {0, 0, (test_callback_fn)0}
 };