Fix libmemcachedprotocol's binary `STAT` and `VERSION` handlers.
authorMichael Wallner <mike@php.net>
Wed, 20 Jan 2021 15:39:30 +0000 (16:39 +0100)
committerMichael Wallner <mike@php.net>
Wed, 20 Jan 2021 15:39:30 +0000 (16:39 +0100)
ChangeLog-1.1.md
docs/source/ChangeLog-1.1.rst
src/libmemcachedprotocol/binary_handler.c

index d9e8bf5f234ab77ed69fd727317b5a35c335888e..02090ca2189de053b7e6c523264997b3e423f868 100644 (file)
@@ -6,6 +6,7 @@
 
 **Changes from beta2:**
 
+* Fix libmemcachedprotocol's binary `STAT` and `VERSION` handlers.
 * Fix [gh #105](https://github.com/m6w6/libmemcached/issues/105):
   EINTR handled too defensively when polling.
 
@@ -32,7 +33,7 @@
 
 > released 2020-12-21
 
-**NOTE:**
+**NOTE:**  
 This is a bug fix release, not a feature release. The minor version number
 was incremented due to the following changes:
 
index 9bcdf781890ed43b0c7fcf3f4ceff82571051875..ab6458c96517be4e2759b38ab865028aa1087a2d 100644 (file)
@@ -16,6 +16,7 @@ v 1.1.0-beta3
 **Changes from beta2:**
 
 
+* Fix libmemcachedprotocol's binary ``STAT`` and ``VERSION`` handlers.
 * Fix `gh #105 <https://github.com/m6w6/libmemcached/issues/105>`_\ :
   EINTR handled too defensively when polling.
 
@@ -51,7 +52,7 @@ v 1.1.0-beta1
    released 2020-12-21
 
 
-**NOTE:**
+**NOTE:**\ :raw-html-m2r:`<br>`
 This is a bug fix release, not a feature release. The minor version number
 was incremented due to the following changes:
 
index a1b072d04e14cef2aa497e5383b379bbd374d2d4..c54196197aeef6bd1744120049d5e40f33aa868d 100644 (file)
@@ -44,7 +44,7 @@ binary_raw_response_handler(const void *cookie, protocol_binary_request_header *
                             protocol_binary_response_header *response) {
   memcached_protocol_client_st *client = (void *) cookie;
 
-  if (client->root->pedantic
+  if (response && client->root->pedantic
       && !memcached_binary_protocol_pedantic_check_response(request, response)) {
     return PROTOCOL_BINARY_RESPONSE_EINVAL;
   }
@@ -53,6 +53,10 @@ binary_raw_response_handler(const void *cookie, protocol_binary_request_header *
     return PROTOCOL_BINARY_RESPONSE_EINTERNAL;
   }
 
+  if (!response) {
+    return PROTOCOL_BINARY_RESPONSE_SUCCESS;
+  }
+
   size_t len = sizeof(protocol_binary_response_header) + htonl(response->response.bodylen);
   size_t offset = 0;
   char *ptr = (void *) response;
@@ -917,6 +921,20 @@ stat_command_handler(const void *cookie, protocol_binary_request_header *header,
 
     rval = client->root->callback->interface.v1.stat(cookie, (void *) (header + 1), keylen,
                                                      stat_response_handler);
+    if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
+      /* END message */
+      protocol_binary_response_no_extras response = {
+          .message = {
+              .header.response =
+                  {
+                      .magic = PROTOCOL_BINARY_RES,
+                      .opcode = PROTOCOL_BINARY_CMD_STAT,
+                      .status = htons(PROTOCOL_BINARY_RESPONSE_SUCCESS),
+                      .opaque = header->request.opaque,
+                  },
+          }};
+      rval = response_handler(cookie, header, &response);
+    }
   } else {
     rval = PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND;
   }
@@ -941,6 +959,9 @@ version_command_handler(const void *cookie, protocol_binary_request_header *head
   memcached_protocol_client_st *client = (void *) cookie;
   if (client->root->callback->interface.v1.version) {
     rval = client->root->callback->interface.v1.version(cookie, version_response_handler);
+    if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
+      rval = response_handler(cookie, header, NULL);
+    }
   } else {
     rval = PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND;
   }