ctdb-protocol: Fix marshalling for ctdb_req_control_data
authorAmitay Isaacs <amitay@gmail.com>
Wed, 26 Jul 2017 16:20:03 +0000 (02:20 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:25 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_control.c
ctdb/tests/cunit/protocol_test_101.sh
ctdb/tests/src/protocol_ctdb_test.c

index a55dd1a082492421c02a1190b6b507c94c9181f6..91383c28356578154db5a15aa79255e43a09a295 100644 (file)
@@ -441,9 +441,9 @@ static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
 }
 
 static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
-                                      uint8_t *buf)
+                                      uint8_t *buf, size_t *npush)
 {
-       size_t np, offset;
+       size_t np = 0, offset;
        uint32_t u32;
 
        switch (cd->opcode) {
@@ -717,14 +717,17 @@ static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
                ctdb_string_push(&cd->data.db_name, buf, &np);
                break;
        }
+
+       *npush = np;
 }
 
 static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
                                      uint32_t opcode,
                                      TALLOC_CTX *mem_ctx,
-                                     struct ctdb_req_control_data *cd)
+                                     struct ctdb_req_control_data *cd,
+                                     size_t *npull)
 {
-       size_t np, offset;
+       size_t np = 0, offset;
        uint32_t u32;
        int ret = 0;
 
@@ -1045,7 +1048,12 @@ static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
                break;
        }
 
-       return ret;
+       if (ret != 0) {
+               return ret;
+       }
+
+       *npull = np;
+       return 0;
 }
 
 static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
@@ -1797,7 +1805,7 @@ int ctdb_req_control_push(struct ctdb_req_header *h,
        wire->flags = request->flags;
 
        wire->datalen = ctdb_req_control_data_len(&request->rdata);
-       ctdb_req_control_data_push(&request->rdata, wire->data);
+       ctdb_req_control_data_push(&request->rdata, wire->data, &np);
 
        return 0;
 }
@@ -1841,7 +1849,7 @@ int ctdb_req_control_pull(uint8_t *buf, size_t buflen,
        c->flags = wire->flags;
 
        ret = ctdb_req_control_data_pull(wire->data, wire->datalen,
-                                        c->opcode, mem_ctx, &c->rdata);
+                                        c->opcode, mem_ctx, &c->rdata, &np);
        if (ret != 0) {
                return ret;
        }
index 44e16fa0df3bce18c7d0a648ffc0a9f2f96a4a81..2c9d953dbb0584fd2662484fb29823ad697ace42 100755 (executable)
@@ -11,6 +11,13 @@ control_output=$(
     echo
 )
 
+generate_control_output ()
+{
+    for i in $(seq 0 $last_control) ; do
+       echo "$1 $i"
+    done
+}
+
 output=$(
     echo "ctdb_req_header"
     echo "ctdb_req_call"
@@ -18,8 +25,7 @@ output=$(
     echo "ctdb_reply_error"
     echo "ctdb_req_dmaster"
     echo "ctdb_reply_dmaster"
-    echo "ctdb_req_control_data"
-    echo "$control_output"
+    generate_control_output "ctdb_req_control_data"
     echo "ctdb_reply_control_data"
     echo "$control_output"
     echo "ctdb_req_control"
index b2918a8fbc5ef9f52276a60842c805147fbc656a..b21cb4e6f33072c21c0b871898cf3788767d4c2f 100644 (file)
@@ -291,35 +291,7 @@ PROTOCOL_CTDB4_TEST(struct ctdb_reply_dmaster, ctdb_reply_dmaster,
 
 #define NUM_CONTROLS   151
 
-static void test_ctdb_req_control_data(void)
-{
-       TALLOC_CTX *mem_ctx;
-       size_t buflen;
-       int ret;
-       struct ctdb_req_control_data cd, cd2;
-       uint32_t opcode;
-
-       printf("ctdb_req_control_data\n");
-       fflush(stdout);
-
-       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
-               mem_ctx = talloc_new(NULL);
-               assert(mem_ctx != NULL);
-
-               printf("%u.. ", opcode);
-               fflush(stdout);
-               fill_ctdb_req_control_data(mem_ctx, &cd, opcode);
-               buflen = ctdb_req_control_data_len(&cd);
-               ctdb_req_control_data_push(&cd, BUFFER);
-               ret = ctdb_req_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
-               assert(ret == 0);
-               verify_ctdb_req_control_data(&cd, &cd2);
-               talloc_free(mem_ctx);
-       }
-
-       printf("\n");
-       fflush(stdout);
-}
+PROTOCOL_CTDB2_TEST(struct ctdb_req_control_data, ctdb_req_control_data);
 
 static void test_ctdb_reply_control_data(void)
 {
@@ -486,6 +458,8 @@ static void test_ctdb_req_message_data(void)
 
 int main(int argc, char *argv[])
 {
+       uint32_t opcode;
+
        if (argc == 2) {
                int seed = atoi(argv[1]);
                srandom(seed);
@@ -499,7 +473,9 @@ int main(int argc, char *argv[])
        TEST_FUNC(ctdb_req_dmaster)();
        TEST_FUNC(ctdb_reply_dmaster)();
 
-       test_ctdb_req_control_data();
+       for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
+               TEST_FUNC(ctdb_req_control_data)(opcode);
+       }
        test_ctdb_reply_control_data();
 
        test_ctdb_req_control();