ctdb-protocol: Fix marshalling for ctdb_event_header
authorAmitay Isaacs <amitay@gmail.com>
Wed, 26 Jul 2017 15:51:40 +0000 (01:51 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:26 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_event.c
ctdb/tests/src/protocol_event_test.c

index 2e68ceded86babc87102c7bea5942283fa43788b..3a1a6eb4d9177470ccd839c7dd6126f7531048cc 100644 (file)
@@ -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);
index 2f3b7c6021b8520a523cb5f15d23f4fe3661bfe6..f5cd981d8071d981973cae8dfa826d00d87c83f6 100644 (file)
@@ -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);