From 54421df6cdc3318187a298a709ea38d07e2e716d Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Thu, 27 Jul 2017 01:51:40 +1000 Subject: [PATCH] ctdb-protocol: Fix marshalling for ctdb_event_header Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- ctdb/protocol/protocol_event.c | 27 +++++++++++++++++---------- ctdb/tests/src/protocol_event_test.c | 10 +++++++--- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/ctdb/protocol/protocol_event.c b/ctdb/protocol/protocol_event.c index 2e68ceded86..3a1a6eb4d91 100644 --- a/ctdb/protocol/protocol_event.c +++ b/ctdb/protocol/protocol_event.c @@ -806,7 +806,8 @@ static size_t ctdb_event_header_len(struct ctdb_event_header *in) return ctdb_uint32_len(&in->length) + ctdb_uint32_len(&in->reqid); } -static void ctdb_event_header_push(struct ctdb_event_header *in, uint8_t *buf) +static void ctdb_event_header_push(struct ctdb_event_header *in, uint8_t *buf, + size_t *npush) { size_t offset = 0, np; @@ -814,11 +815,15 @@ static void ctdb_event_header_push(struct ctdb_event_header *in, uint8_t *buf) offset += np; ctdb_uint32_push(&in->reqid, buf+offset, &np); + offset += np; + + *npush = offset; } static int ctdb_event_header_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx, - struct ctdb_event_header *out) + struct ctdb_event_header *out, + size_t *npull) { size_t offset = 0, np; int ret; @@ -833,7 +838,9 @@ static int ctdb_event_header_pull(uint8_t *buf, size_t buflen, if (ret != 0) { return ret; } + offset += np; + *npull = offset; return 0; } @@ -862,8 +869,8 @@ int ctdb_event_request_push(struct ctdb_event_request *in, in->header.length = *buflen; - ctdb_event_header_push(&in->header, buf); - offset += ctdb_event_header_len(&in->header); + ctdb_event_header_push(&in->header, buf, &np); + offset += np; ctdb_event_request_data_push(&in->rdata, buf+offset, &np); @@ -877,11 +884,11 @@ int ctdb_event_request_pull(uint8_t *buf, size_t buflen, size_t offset = 0, np; int ret; - ret = ctdb_event_header_pull(buf, buflen, mem_ctx, &out->header); + ret = ctdb_event_header_pull(buf, buflen, mem_ctx, &out->header, &np); if (ret != 0) { return ret; } - offset += ctdb_event_header_len(&out->header); + offset += np; ret = ctdb_event_request_data_pull(buf+offset, buflen-offset, mem_ctx, &out->rdata, &np); @@ -911,8 +918,8 @@ int ctdb_event_reply_push(struct ctdb_event_reply *in, in->header.length = *buflen; - ctdb_event_header_push(&in->header, buf); - offset += ctdb_event_header_len(&in->header); + ctdb_event_header_push(&in->header, buf, &np); + offset += np; ctdb_event_reply_data_push(&in->rdata, buf+offset, &np); @@ -926,11 +933,11 @@ int ctdb_event_reply_pull(uint8_t *buf, size_t buflen, size_t offset = 0, np; int ret; - ret = ctdb_event_header_pull(buf, buflen, mem_ctx, &out->header); + ret = ctdb_event_header_pull(buf, buflen, mem_ctx, &out->header, &np); if (ret != 0) { return ret; } - offset += ctdb_event_header_len(&out->header); + offset += np; ret = ctdb_event_reply_data_pull(buf+offset, buflen-offset, mem_ctx, &out->rdata, &np); diff --git a/ctdb/tests/src/protocol_event_test.c b/ctdb/tests/src/protocol_event_test.c index 2f3b7c6021b..f5cd981d807 100644 --- a/ctdb/tests/src/protocol_event_test.c +++ b/ctdb/tests/src/protocol_event_test.c @@ -96,7 +96,7 @@ static void TEST_FUNC(NAME)(uint32_t command) \ static void test_ctdb_event_header(void) { TALLOC_CTX *mem_ctx; - size_t buflen; + size_t buflen, np = 0; struct ctdb_event_header h, h2; int ret; @@ -109,9 +109,13 @@ static void test_ctdb_event_header(void) ctdb_event_header_fill(&h, REQID); buflen = ctdb_event_header_len(&h); - ctdb_event_header_push(&h, BUFFER); - ret = ctdb_event_header_pull(BUFFER, buflen, mem_ctx, &h2); + assert(buflen < sizeof(BUFFER)); + ctdb_event_header_push(&h, BUFFER, &np); + assert(np == buflen); + np = 0; + ret = ctdb_event_header_pull(BUFFER, buflen, mem_ctx, &h2, &np); assert(ret == 0); + assert(np == buflen); verify_ctdb_event_header(&h, &h2); -- 2.11.4.GIT