add error checking, for command overflow, and short writes
authorMark Atwood <mark@fallenpegasus.com>
Sat, 22 Sep 2007 22:09:03 +0000 (15:09 -0700)
committerMark Atwood <mark@fallenpegasus.com>
Sat, 22 Sep 2007 22:09:03 +0000 (15:09 -0700)
lib/memcached_auto.c
lib/memcached_delete.c
lib/memcached_flush.c
lib/memcached_get.c
lib/memcached_stats.c
lib/memcached_storage.c
lib/memcached_verbosity.c

index 7122dc90096e6db4659dfc2120d0e32660e6085a..86ee7669fbd1062fe1f84d037b96644988cc0cc4 100644 (file)
@@ -6,7 +6,7 @@ static memcached_return memcached_auto(memcached_st *ptr,
                                        unsigned int offset,
                                        unsigned int *value)
 {
-  size_t send_length;
+  size_t send_length, sent_length;
   memcached_return rc;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   unsigned int server_key;
@@ -22,8 +22,11 @@ static memcached_return memcached_auto(memcached_st *ptr,
                         "%s %.*s %u\r\n", verb, 
                         (int)key_length, key,
                         offset);
-
-  if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
+  if ((sent_length= write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+    return MEMCACHED_WRITE_FAILURE;
+  if (sent_length != send_length)
     return MEMCACHED_WRITE_FAILURE;
 
   memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE);
index d24c0f82a0b7d16ffff58e922a09a05f97817010..11b22ece6bbbd7957447f9c9fb3343742bd3e89f 100644 (file)
@@ -3,7 +3,7 @@
 memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length,
                                   time_t expiration)
 {
-  size_t send_length;
+  size_t send_length, sent_length;
   memcached_return rc;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   unsigned int server_key;
@@ -23,7 +23,12 @@ memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_lengt
     send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
                           "delete %.*s\r\n", (int)key_length, key);
 
-  if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
+
+  if ((sent_length = write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+    return MEMCACHED_WRITE_FAILURE;
+  if (sent_length != send_length)
     return MEMCACHED_WRITE_FAILURE;
 
   return memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
index 8c51cdf1f85f8e9e44d3fa7a67fb673aac42aa52..4ca73e30ab977126b283e2f91b5d2312126872c0 100644 (file)
@@ -3,7 +3,7 @@
 memcached_return memcached_flush(memcached_st *ptr, time_t expiration)
 {
   unsigned int x;
-  size_t send_length;
+  size_t send_length, sent_length;
   memcached_return rc;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
 
@@ -20,7 +20,13 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration)
     else
       send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
                             "flush_all\r\n");
-    if ((write(ptr->hosts[x].fd, buffer, send_length) == -1))
+
+    if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+      return MEMCACHED_WRITE_FAILURE;
+
+    if ((sent_length= write(ptr->hosts[x].fd, buffer, send_length) == -1))
+      return MEMCACHED_WRITE_FAILURE;
+    if (sent_length != send_length)
       return MEMCACHED_WRITE_FAILURE;
 
     rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, x);
index a18854506d4743b9fb7d404786adbd16434c34e1..9eb60e2668afafecc589ef800955540220c93238 100644 (file)
@@ -5,7 +5,7 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
                     uint16_t *flags,
                     memcached_return *error)
 {
-  size_t send_length;
+  size_t send_length, sent_length;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   char *string_ptr;
   unsigned int server_key;
@@ -20,14 +20,19 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
 
   send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, "get %.*s\r\n", 
                         (int)key_length, key);
-  if (*error != MEMCACHED_SUCCESS)
-    return NULL;
 
-  if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
+
+  if ((sent_length = write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
   {
     *error= MEMCACHED_WRITE_FAILURE;
     return NULL;
   }
+  if (sent_length != send_length) {
+    *error= MEMCACHED_WRITE_FAILURE;
+    return NULL;
+  }
 
   memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE);
   *error= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
index d7f948faad31c99ec4999b110c987982e750367f..8a05dfd93a30d12c0d8d409906ac2b08c904b73e 100644 (file)
@@ -122,7 +122,7 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
 {
   memcached_return rc;
   char buffer[HUGE_STRING_LEN];
-  size_t send_length;
+  size_t send_length, sent_length;
 
   rc= memcached_connect(ptr);
 
@@ -136,12 +136,18 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
     send_length= snprintf(buffer, HUGE_STRING_LEN, 
                           "stats\r\n");
 
-  if ((write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
+  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
+
+  if ((sent_length= write(ptr->hosts[server_key].fd, buffer, send_length) == -1))
   {
     fprintf(stderr, "failed on stats\n");
 
     return MEMCACHED_WRITE_FAILURE;
   }
+  if (sent_length != send_length)
+    return MEMCACHED_WRITE_FAILURE;
+
 
   rc= memcached_response(ptr, buffer, HUGE_STRING_LEN, 0);
 
index 484341c842c286ad2dd8fd106cc5ebfe328f70e7..21dc0934595781f541ffc82b1fbbc8605bca68f5 100644 (file)
@@ -35,6 +35,8 @@ static memcached_return memcached_send(memcached_st *ptr,
                         "%s %.*s %x %llu %zu\r\n", verb,
                         (int)key_length, key, flags, 
                         (unsigned long long)expiration, value_length);
+  if (write_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
   if ((sent_length= write(ptr->hosts[server_key].fd, buffer, write_length)) == -1)
     return MEMCACHED_WRITE_FAILURE;
   assert(write_length == sent_length);
index 506dbb07a6f5760a663f7d849e785fed7deaff97..ecea6f225c16d6c88f228c4172d819efcbf4bd19 100644 (file)
@@ -3,7 +3,7 @@
 memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity)
 {
   unsigned int x;
-  size_t send_length;
+  size_t send_length, sent_length;
   memcached_return rc;
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
 
@@ -14,12 +14,16 @@ memcached_return memcached_verbosity(memcached_st *ptr, unsigned int verbosity)
 
   send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
                         "verbosity %u\r\n", verbosity);
+  if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
+    return MEMCACHED_WRITE_FAILURE;
 
   for (x= 0; x < ptr->number_of_hosts; x++)
   {
     memcached_return rc;
 
-    if ((write(ptr->hosts[x].fd, buffer, send_length) == -1))
+    if ((sent_length= write(ptr->hosts[x].fd, buffer, send_length) == -1))
+      return MEMCACHED_WRITE_FAILURE;
+    if (sent_length != send_length)
       return MEMCACHED_WRITE_FAILURE;
 
     rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, x);