Fix conditional jump in error message creation.
authorBrian Aker <brian@tangent.org>
Fri, 10 Jun 2011 22:16:29 +0000 (15:16 -0700)
committerBrian Aker <brian@tangent.org>
Fri, 10 Jun 2011 22:16:29 +0000 (15:16 -0700)
libmemcached/connect.cc
libmemcached/error.cc
libmemcached/io.cc
libmemcached/options.cc

index c9e91020e44f7dbe4d97bb638fcc63d6444a18b1..1d45ded110798b13a4c91be05e9bb974fbc8ab84 100644 (file)
@@ -47,11 +47,11 @@ static memcached_return_t connect_poll(memcached_server_st *ptr)
   fds[0].fd = ptr->fd;
   fds[0].events = POLLOUT;
 
-  int error;
   size_t loop_max= 5;
 
   while (--loop_max) // Should only loop on cases of ERESTART or EINTR
   {
+    int error;
     if (ptr->root->poll_timeout)
     {
       error= poll(fds, 1, ptr->root->connect_timeout);
@@ -76,9 +76,7 @@ static memcached_return_t connect_poll(memcached_server_st *ptr)
         }
         else
         {
-          ptr->cached_errno= errno;
-
-          return MEMCACHED_ERRNO;
+          return memcached_set_errno(*ptr, err, MEMCACHED_AT);
         }
       }
     case 0:
@@ -93,7 +91,15 @@ static memcached_return_t connect_poll(memcached_server_st *ptr)
 #endif
       case EINTR:
         continue;
-      default:
+
+      case EFAULT:
+      case ENOMEM:
+        return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
+
+      case EINVAL:
+        return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
+
+      default: // This should not happen
         if (fds[0].revents & POLLERR)
         {
           int err;
index 7914a165e9c8617cc57ba97c60c92d7697ceb223..b5e947a43ae91705f5cb12aeb0a440f6c4b2d29c 100644 (file)
@@ -89,12 +89,12 @@ static void _set(memcached_st& memc, memcached_string_t *str, memcached_return_t
   error->rc= rc;
   error->local_errno= local_errno;
 
-  if (str and local_errno)
+  if (str and str->size and local_errno)
   {
     error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s(%s), %.*s -> %s", 
                                memcached_strerror(&memc, rc), 
                                strerror(local_errno),
-                               int(error->size), str->c_str, at);
+                               memcached_string_printf(*str), at);
   }
   else if (local_errno)
   {
@@ -102,11 +102,11 @@ static void _set(memcached_st& memc, memcached_string_t *str, memcached_return_t
                                memcached_strerror(&memc, rc), 
                                strerror(local_errno), at);
   }
-  else if (str)
+  else if (str and str->size)
   {
     error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s, %.*s -> %s", 
                                memcached_strerror(&memc, rc), 
-                               int(error->size), str->c_str, at);
+                               int(str->size), str->c_str, at);
   }
   else
   {
index d2c3a03d33a73e535e4fac305daa94d7365e5408..fb4b00226d7c1b40fdf3fa789920c245e7ce4214 100644 (file)
@@ -118,6 +118,13 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
       case EINTR:
         break;
 
+      case EFAULT:
+      case ENOMEM:
+        return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
+
+      case EINVAL:
+        return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
+
       default:
         if (fds.revents & POLLERR)
         {
index d8b44ff7a1bac77aaaae0cecb70eb96bca2fb81b..16f378e87393dc3a83f7924ea4b7ffec50aecb86 100644 (file)
@@ -89,9 +89,10 @@ memcached_return_t libmemcached_check_configuration(const char *option_string, s
     return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
 
   memcached_return_t rc= memcached_parse_configuration(memc_ptr, option_string, length);
-  if (memcached_failed(rc) && error_buffer && error_buffer_size)
+  if (memcached_failed(rc) and error_buffer and error_buffer_size)
   {
     strncpy(error_buffer, memcached_last_error_message(memc_ptr), error_buffer_size);
+    error_buffer[length -1]= 0;
   }
 
   bool has_filename= memcached_behavior_get(memc_ptr, MEMCACHED_BEHAVIOR_LOAD_FROM_FILE);