summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrond Norbye <Trond.Norbye@sun.com>2009-03-13 08:20:27 +0100
committerTrond Norbye <Trond.Norbye@sun.com>2009-03-13 08:20:27 +0100
commit5e40caa44b5e1affa4e8a4d6a08481f3d5efcaee (patch)
treeb4bd5b7b7814b1e406ffffc1f2b9d82838557486
parent9ed4b9f649ebd078bbd2f6ec6e29884aaa7d8853 (diff)
downloadmemcached-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.c36
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) {