diff -up memcached-1.4.15/items.c.CVE-2016-8704_8705_8706 memcached-1.4.15/items.c
--- memcached-1.4.15/items.c.CVE-2016-8704_8705_8706 2016-11-07 11:14:13.099196427 +0100
+++ memcached-1.4.15/items.c 2016-11-07 11:14:13.104196443 +0100
@@ -91,6 +91,9 @@ item *do_item_alloc(char *key, const siz
uint8_t nsuffix;
item *it = NULL;
char suffix[40];
+ if (nbytes < 2 || nkey < 0)
+ return 0;
+
size_t ntotal = item_make_header(nkey + 1, flags, nbytes, suffix, &nsuffix);
if (settings.use_cas) {
ntotal += sizeof(uint64_t);
diff -up memcached-1.4.15/memcached.c.CVE-2016-8704_8705_8706 memcached-1.4.15/memcached.c
--- memcached-1.4.15/memcached.c.CVE-2016-8704_8705_8706 2016-11-07 11:14:13.103196439 +0100
+++ memcached-1.4.15/memcached.c 2016-11-07 11:14:13.105196446 +0100
@@ -1790,10 +1790,16 @@ static bool authenticated(conn *c) {
static void dispatch_bin_command(conn *c) {
int protocol_error = 0;
- int extlen = c->binary_header.request.extlen;
- int keylen = c->binary_header.request.keylen;
+ uint8_t extlen = c->binary_header.request.extlen;
+ uint16_t keylen = c->binary_header.request.keylen;
uint32_t bodylen = c->binary_header.request.bodylen;
+ if (keylen > bodylen || keylen + extlen > bodylen) {
+ write_bin_error(c, PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND, 0);
+ c->write_and_go = conn_closing;
+ return;
+ }
+
if (settings.sasl && !authenticated(c)) {
write_bin_error(c, PROTOCOL_BINARY_RESPONSE_AUTH_ERROR, 0);
c->write_and_go = conn_closing;