Comment #7 on issue 106 by [email protected]: binary protocol parsing can cause memcached server lockup
http://code.google.com/p/memcached/issues/detail?id=106

Ok. 1.6.0-beta1 still suffer from this problem, the principle is similar. Following patch solve it (I thought).


--- ./daemon/memcached.ori.c    2011-06-28 09:43:45.120000072 +0800
+++ ./daemon/memcached.c        2011-06-28 09:57:18.390999971 +0800
@@ -689,13 +689,19 @@
         c->sasl_conn = NULL;
     }

-    c->engine_storage = NULL;
-    c->tap_iterator = NULL;
-    c->thread = NULL;
-    assert(c->next == NULL);
-    c->ascii_cmd = NULL;
-    c->sfd = INVALID_SOCKET;
-    c->tap_nack_mode = false;
+    if (IS_UDP(c->transport)) {
+        recvfrom(c->sfd, NULL, 0, 0, NULL, NULL);
+        conn_set_state(c, conn_new_cmd);
+    } else {
+        c->sfd = INVALID_SOCKET;
+        c->engine_storage = NULL;
+        c->tap_iterator = NULL;
+        c->thread = NULL;
+        assert(c->next == NULL);
+        c->ascii_cmd = NULL;
+        c->tap_nack_mode = false;
+    }
+
 }

 void conn_close(conn *c) {
@@ -4826,7 +4832,7 @@
         res -= 8;
         memmove(c->rbuf, c->rbuf + 8, res);

-        c->rbytes += res;
+        c->rbytes = res;
         c->rcurr = c->rbuf;
         return READ_DATA_RECEIVED;
     }


Reply via email to