libmemcached-1.0: add memcached_return_t::MEMCACHED_UNIX_SOCKET_PATH_TOO_BIG
authorMichael Wallner <mike@php.net>
Mon, 6 Jan 2020 11:31:51 +0000 (12:31 +0100)
committerMichael Wallner <mike@php.net>
Mon, 6 Jan 2020 12:45:01 +0000 (13:45 +0100)
detect a possible string truncation and return an appropriate error

docs/source/libmemcached/memcached_return_t.rst
libmemcached-1.0/types/return.h
libmemcached/connect.cc
libmemcached/strerror.cc
tests/libmemcached-1.0/mem_functions.cc

index 9eba3fabeb42bfecfcadec012856cbae53ec59ef..0cf7d762aac1364e5844a30d3bd6506a843ccbcd 100644 (file)
@@ -123,10 +123,11 @@ Libmemcached return types:
 :c:type:`MEMCACHED_PARSE_USER_ERROR`
 
 :c:type:`MEMCACHED_DEPRECATED`
+
+:c:type:`MEMCACHED_UNIX_SOCKET_PATH_TOO_BIG`
    
 --------
 SEE ALSO
 --------
 
 :manpage:`memcached` :manpage:`libmemcached` :manpage:`memcached_client_error` or :manpage:`memcached_worker_error`
-
index f4ec9b088a8460804e4b440035574feb0d35231f..80c9051500ec37e28177590e4c494795794bd26b 100644 (file)
@@ -86,6 +86,7 @@ enum memcached_return_t {
   MEMCACHED_IN_PROGRESS,
   MEMCACHED_SERVER_TEMPORARILY_DISABLED,
   MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE,
+  MEMCACHED_UNIX_SOCKET_PATH_TOO_BIG,
   MEMCACHED_MAXIMUM_RETURN, /* Always add new error code before */
   MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE= MEMCACHED_ERROR
 };
index 006810bf68e7bab59aed176858253dd2999fbe33..6d9003770b039eaa30606d43280e2936e100dc44 100644 (file)
@@ -466,7 +466,10 @@ static memcached_return_t unix_socket_connect(memcached_instance_st* server)
 
     memset(&servAddr, 0, sizeof (struct sockaddr_un));
     servAddr.sun_family= AF_UNIX;
-    strncpy(servAddr.sun_path, server->hostname(), sizeof(servAddr.sun_path)); /* Copy filename */
+    if (strlen(server->hostname()) >= sizeof(servAddr.sun_path)) {
+        return memcached_set_error(*server, MEMCACHED_UNIX_SOCKET_PATH_TOO_BIG, MEMCACHED_AT);
+    }
+    strncpy(servAddr.sun_path, server->hostname(), sizeof(servAddr.sun_path)-1); /* Copy filename */
 
     if (connect(server->fd, (struct sockaddr *)&servAddr, sizeof(servAddr)) == -1)
     {
index 7a4e0a82d1c1811f36fbf1469736d86e55602eb3..c5615ca9f37e55cef5c8d20d8175e86cba35d679 100644 (file)
@@ -188,6 +188,9 @@ const char *memcached_strerror(const memcached_st *, memcached_return_t rc)
   case MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE:
     return "SERVER FAILED TO ALLOCATE OBJECT";
 
+  case MEMCACHED_UNIX_SOCKET_PATH_TOO_BIG:
+    return "UNIX SOCKET PATH TOO LARGE";
+
   default:
   case MEMCACHED_MAXIMUM_RETURN:
     return "INVALID memcached_return_t";
index 321a35dbac19e613ffa21813853ea15895f3efac..0e6bcb7f7083aff39edd2e25683fcf7b9d567559 100644 (file)
@@ -496,7 +496,7 @@ test_return_t memcached_return_t_TEST(memcached_st *memc)
                         4159057246U, 3425930182U, 2593724503U,  1868899624U,
                         1769812374U, 2302537950U, 1110330676U, 3365377466U, 
                         1336171666U, 3021258493U, 2334992265U, 3861994737U, 
-                        3582734124U, 3365377466U };
+                        3582734124U, 3889811103, 3365377466U };
 
   // You have updated the memcache_error messages but not updated docs/tests.
   for (int rc= int(MEMCACHED_SUCCESS); rc < int(MEMCACHED_MAXIMUM_RETURN); ++rc)
@@ -512,7 +512,7 @@ test_return_t memcached_return_t_TEST(memcached_st *memc)
     }
     test_compare(values[rc], hash_val);
   }
-  test_compare(49, int(MEMCACHED_MAXIMUM_RETURN));
+  test_compare(50, int(MEMCACHED_MAXIMUM_RETURN));
 
   return TEST_SUCCESS;
 }