This fixes lp:1010899, which showed a condition where we could end up with a bad...
[m6w6/libmemcached] / libmemcached-1.0 / memcached.hpp
index 4e1e17780c31faa6e93710137597ccd2a1f0a473..03fbe40239eb1355bad54804d23440e47975fc10 100644 (file)
@@ -75,7 +75,7 @@ public:
 
   Memcache()
   {
-    memc= memcached("", 0);
+    memc= memcached(NULL, 0);
   }
 
   Memcache(const std::string &config)
@@ -85,7 +85,7 @@ public:
 
   Memcache(const std::string &hostname, in_port_t port)
   {
-    memc= memcached("", 0);
+    memc= memcached(NULL, 0);
     if (memc)
     {
       memcached_server_add(memc, hostname.c_str(), port);
@@ -254,7 +254,8 @@ public:
       // Actual value, null terminated
       ret_val.reserve(memcached_result_length(result) +1);
       ret_val.assign(memcached_result_value(result),
-                     memcached_result_value(result) +memcached_result_length(result));
+                     memcached_result_value(result) +memcached_result_length(result) +1);
+      ret_val.resize(memcached_result_length(result));
 
       // Misc
       flags= memcached_result_flags(result);
@@ -292,9 +293,11 @@ public:
                                &value_length, &flags, &rc);
     if (value != NULL && ret_val.empty())
     {
-      ret_val.reserve(value_length);
-      ret_val.assign(value, value +value_length);
+      ret_val.reserve(value_length +1); // Always provide null
+      ret_val.assign(value, value +value_length +1);
+      ret_val.resize(value_length);
       free(value);
+
       return true;
     }
 
@@ -327,9 +330,11 @@ public:
                                       &value_length, &flags, &rc);
     if (value)
     {
-      ret_val.reserve(value_length);
-      ret_val.assign(value, value +value_length);
+      ret_val.reserve(value_length +1); // Always provide null
+      ret_val.assign(value, value +value_length +1);
+      ret_val.resize(value_length);
       free(value);
+
       return true;
     }
     return false;
@@ -399,6 +404,18 @@ public:
     return memcached_success(rc);
   }
 
+  bool set(const std::string &key,
+           const char* value, const size_t value_length,
+           time_t expiration,
+           uint32_t flags)
+  {
+    memcached_return_t rc= memcached_set(memc,
+                                         key.c_str(), key.length(),
+                                         value, value_length,
+                                         expiration, flags);
+    return memcached_success(rc);
+  }
+
   /**
    * Writes an object to a server specified by the master_key parameter.
    * If the object already exists, it will overwrite the existing object.