diff options
author | Trond Norbye <Trond.Norbye@sun.com> | 2009-03-13 08:20:27 +0100 |
---|---|---|
committer | Trond Norbye <Trond.Norbye@sun.com> | 2009-03-13 08:20:27 +0100 |
commit | 5e40caa44b5e1affa4e8a4d6a08481f3d5efcaee (patch) | |
tree | b4bd5b7b7814b1e406ffffc1f2b9d82838557486 | |
parent | 9ed4b9f649ebd078bbd2f6ec6e29884aaa7d8853 (diff) | |
download | memcached-5e40caa44b5e1affa4e8a4d6a08481f3d5efcaee.tar.gz |
Fix alignment bug in append_bin_stats
See http://code.google.com/p/memcached/issues/detail?id=26
-rw-r--r-- | memcached.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/memcached.c b/memcached.c index bc84375..f6a287f 100644 --- a/memcached.c +++ b/memcached.c @@ -1274,34 +1274,30 @@ static void process_bin_get(conn *c) { uint32_t append_bin_stats(char *buf, const char *key, const uint16_t klen, const char *val, const uint32_t vlen, void *cookie) { - protocol_binary_response_header *header; - char *ptr = buf; - uint32_t bodylen = klen + vlen; - header = (protocol_binary_response_header *)ptr; conn *c = (conn *)cookie; - - header->response.magic = (uint8_t)PROTOCOL_BINARY_RES; - header->response.opcode = PROTOCOL_BINARY_CMD_STAT; - header->response.keylen = (uint16_t)htons(klen); - header->response.extlen = (uint8_t)0; - header->response.datatype = (uint8_t)PROTOCOL_BINARY_RAW_BYTES; - header->response.status = (uint16_t)htons(0); - header->response.bodylen = htonl(bodylen); - header->response.opaque = c->opaque; - header->response.cas = swap64(0); - ptr += sizeof(header->response); + uint32_t bodylen = klen + vlen; + protocol_binary_response_header header = { + .response.magic = (uint8_t)PROTOCOL_BINARY_RES, + .response.opcode = PROTOCOL_BINARY_CMD_STAT, + .response.keylen = (uint16_t)htons(klen), + .response.datatype = (uint8_t)PROTOCOL_BINARY_RAW_BYTES, + .response.bodylen = htonl(bodylen), + .response.opaque = c->opaque + }; + + memcpy(buf, header.bytes, sizeof(header.response)); + buf += sizeof(header.response); if (klen > 0) { - memcpy(ptr, key, klen); - ptr += klen; + memcpy(buf, key, klen); + buf += klen; if (vlen > 0) { - memcpy(ptr, val, vlen); - ptr += vlen; + memcpy(buf, val, vlen); } } - return sizeof(header->response) + klen + vlen; + return sizeof(header.response) + bodylen; } static void process_bin_stat(conn *c) { |