ctdb-protocol: Fix marshalling for ctdb_script
authorAmitay Isaacs <amitay@gmail.com>
Wed, 12 Jul 2017 07:59:02 +0000 (17:59 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:24 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_private.h
ctdb/protocol/protocol_types.c
ctdb/tests/src/protocol_common.c
ctdb/tests/src/protocol_types_compat_test.c
ctdb/tests/src/protocol_types_test.c

index 0d0355db9c1a895f50b0fa327cee66376ae4ae52..295ae71e2290fa0737c5904eeb170345945177ac 100644 (file)
@@ -254,10 +254,10 @@ void ctdb_node_map_push(struct ctdb_node_map *in, uint8_t *buf, size_t *npush);
 int ctdb_node_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                       struct ctdb_node_map **out, size_t *npull);
 
-size_t ctdb_script_len(struct ctdb_script *script);
-void ctdb_script_push(struct ctdb_script *script, uint8_t *buf);
+size_t ctdb_script_len(struct ctdb_script *in);
+void ctdb_script_push(struct ctdb_script *in, uint8_t *buf, size_t *npush);
 int ctdb_script_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                    struct ctdb_script **out);
+                    struct ctdb_script **out, size_t *npull);
 
 size_t ctdb_script_list_len(struct ctdb_script_list *script_list);
 void ctdb_script_list_push(struct ctdb_script_list *script_list, uint8_t *buf);
index c98e0d922c840b4c3cee85535125a571644a87be..b1a729e186b862780002e75358afdf26b51064a1 100644 (file)
@@ -3689,46 +3689,111 @@ fail:
        return ret;
 }
 
-size_t ctdb_script_len(struct ctdb_script *script)
+size_t ctdb_script_len(struct ctdb_script *in)
 {
-       return sizeof(struct ctdb_script);
+       return ctdb_chararray_len(in->name, MAX_SCRIPT_NAME+1) +
+               ctdb_timeval_len(&in->start) +
+               ctdb_timeval_len(&in->finished) +
+               ctdb_int32_len(&in->status) +
+               ctdb_chararray_len(in->output, MAX_SCRIPT_OUTPUT+1) +
+               ctdb_padding_len(4);
 }
 
-void ctdb_script_push(struct ctdb_script *script, uint8_t *buf)
+void ctdb_script_push(struct ctdb_script *in, uint8_t *buf, size_t *npush)
 {
-       memcpy(buf, script, sizeof(struct ctdb_script));
+       size_t offset = 0, np;
+
+       ctdb_chararray_push(in->name, MAX_SCRIPT_NAME+1, buf+offset, &np);
+       offset += np;
+
+       ctdb_timeval_push(&in->start, buf+offset, &np);
+       offset += np;
+
+       ctdb_timeval_push(&in->finished, buf+offset, &np);
+       offset += np;
+
+       ctdb_int32_push(&in->status, buf+offset, &np);
+       offset += np;
+
+       ctdb_chararray_push(in->output, MAX_SCRIPT_OUTPUT+1, buf+offset, &np);
+       offset += np;
+
+       ctdb_padding_push(4, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
 }
 
 static int ctdb_script_pull_elems(uint8_t *buf, size_t buflen,
                                  TALLOC_CTX *mem_ctx,
-                                 struct ctdb_script *out)
+                                 struct ctdb_script *out, size_t *npull)
 {
-       if (buflen < sizeof(struct ctdb_script)) {
-               return EMSGSIZE;
+       size_t offset = 0, np;
+       int ret;
+
+       ret = ctdb_chararray_pull(buf+offset, buflen-offset,
+                                 out->name, MAX_SCRIPT_NAME+1, &np);
+       if (ret != 0) {
+               return ret;
        }
+       offset += np;
 
-       memcpy(out, buf, sizeof(struct ctdb_script));
+       ret = ctdb_timeval_pull(buf+offset, buflen-offset, &out->start, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
 
+       ret = ctdb_timeval_pull(buf+offset, buflen-offset, &out->finished,
+                               &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       ret = ctdb_int32_pull(buf+offset, buflen-offset, &out->status, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       ret = ctdb_chararray_pull(buf+offset, buflen-offset,
+                                 out->output, MAX_SCRIPT_OUTPUT+1, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       ret = ctdb_padding_pull(buf+offset, buflen-offset, 4, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       *npull = offset;
        return 0;
 }
 
 int ctdb_script_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                    struct ctdb_script **out)
+                    struct ctdb_script **out, size_t *npull)
 {
-       struct ctdb_script *script;
+       struct ctdb_script *val;
+       size_t np;
        int ret;
 
-       script = talloc(mem_ctx, struct ctdb_script);
-       if (script == NULL) {
+       val = talloc(mem_ctx, struct ctdb_script);
+       if (val == NULL) {
                return ENOMEM;
        }
 
-       ret = ctdb_script_pull_elems(buf, buflen, script, script);
+       ret = ctdb_script_pull_elems(buf, buflen, val, val, &np);
        if (ret != 0) {
-               TALLOC_FREE(script);
+               TALLOC_FREE(val);
+               return ret;
        }
 
-       *out = script;
+       *out = val;
+       *npull = np;
        return ret;
 }
 
@@ -3757,7 +3822,7 @@ void ctdb_script_list_push(struct ctdb_script_list *script_list, uint8_t *buf)
 {
        struct ctdb_script_list_wire *wire =
                (struct ctdb_script_list_wire *)buf;
-       size_t offset;
+       size_t offset, np;
        int i;
 
        if (script_list == NULL) {
@@ -3768,8 +3833,8 @@ void ctdb_script_list_push(struct ctdb_script_list *script_list, uint8_t *buf)
 
        offset = offsetof(struct ctdb_script_list_wire, script);
        for (i=0; i<script_list->num_scripts; i++) {
-               ctdb_script_push(&script_list->script[i], &buf[offset]);
-               offset += ctdb_script_len(&script_list->script[i]);
+               ctdb_script_push(&script_list->script[i], &buf[offset], &np);
+               offset += np;
        }
 }
 
@@ -3779,7 +3844,7 @@ int ctdb_script_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        struct ctdb_script_list *script_list;
        struct ctdb_script_list_wire *wire =
                (struct ctdb_script_list_wire *)buf;
-       size_t offset;
+       size_t offset, np;
        int i;
        bool ret;
 
@@ -3821,12 +3886,12 @@ int ctdb_script_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        for (i=0; i<wire->num_scripts; i++) {
                ret = ctdb_script_pull_elems(&buf[offset], buflen-offset,
                                             script_list->script,
-                                            &script_list->script[i]);
+                                            &script_list->script[i], &np);
                if (ret != 0) {
                        talloc_free(script_list);
                        return ret;
                }
-               offset += ctdb_script_len(&script_list->script[i]);
+               offset += np;
        }
 
        *out = script_list;
index f459c019b8319fcad21549cd3e8c14f23ee7d27d..4956b4e585bb851d92857e6ee81b8011138eeffd 100644 (file)
@@ -1053,12 +1053,20 @@ void verify_ctdb_node_map(struct ctdb_node_map *p1, struct ctdb_node_map *p2)
 
 void fill_ctdb_script(TALLOC_CTX *mem_ctx, struct ctdb_script *p)
 {
-       fill_buffer(p, sizeof(struct ctdb_script));
+       fill_string(p->name, MAX_SCRIPT_NAME+1);
+       fill_ctdb_timeval(&p->start);
+       fill_ctdb_timeval(&p->finished);
+       p->status = rand32i();
+       fill_string(p->output, MAX_SCRIPT_OUTPUT+1);
 }
 
 void verify_ctdb_script(struct ctdb_script *p1, struct ctdb_script *p2)
 {
-       verify_buffer(p1, p2, sizeof(struct ctdb_script));
+       verify_string(p1->name, p2->name);
+       verify_ctdb_timeval(&p1->start, &p2->start);
+       verify_ctdb_timeval(&p1->finished, &p2->finished);
+       assert(p1->status == p2->status);
+       verify_string(p1->output, p2->output);
 }
 
 void fill_ctdb_script_list(TALLOC_CTX *mem_ctx, struct ctdb_script_list *p)
index 3454e638b7f0965d7a86c86275e19c9ac2eab57a..1e8de018ce70d538f45074b867c642faba6aebb9 100644 (file)
@@ -1431,6 +1431,50 @@ static int ctdb_node_map_pull_old(uint8_t *buf, size_t buflen,
        return 0;
 }
 
+static size_t ctdb_script_len_old(struct ctdb_script *in)
+{
+       return sizeof(struct ctdb_script);
+}
+
+static void ctdb_script_push_old(struct ctdb_script *in, uint8_t *buf)
+{
+       memcpy(buf, in, sizeof(struct ctdb_script));
+}
+
+static int ctdb_script_pull_elems_old(uint8_t *buf, size_t buflen,
+                                     TALLOC_CTX *mem_ctx,
+                                     struct ctdb_script *out)
+{
+       if (buflen < sizeof(struct ctdb_script)) {
+               return EMSGSIZE;
+       }
+
+       memcpy(out, buf, sizeof(struct ctdb_script));
+
+       return 0;
+}
+
+static int ctdb_script_pull_old(uint8_t *buf, size_t buflen,
+                               TALLOC_CTX *mem_ctx, struct ctdb_script **out)
+{
+       struct ctdb_script *val;
+       int ret;
+
+       val = talloc(mem_ctx, struct ctdb_script);
+       if (val == NULL) {
+               return ENOMEM;
+       }
+
+       ret = ctdb_script_pull_elems_old(buf, buflen, val, val);
+       if (ret != 0) {
+               TALLOC_FREE(val);
+               return ret;
+       }
+
+       *out = val;
+       return ret;
+}
+
 
 COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics);
 COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
@@ -1460,6 +1504,7 @@ COMPAT_TYPE3_TEST(struct ctdb_public_ip, ctdb_public_ip);
 COMPAT_TYPE3_TEST(struct ctdb_public_ip_list, ctdb_public_ip_list);
 COMPAT_TYPE3_TEST(struct ctdb_node_and_flags, ctdb_node_and_flags);
 COMPAT_TYPE3_TEST(struct ctdb_node_map, ctdb_node_map);
+COMPAT_TYPE3_TEST(struct ctdb_script, ctdb_script);
 
 int main(int argc, char *argv[])
 {
@@ -1494,6 +1539,7 @@ int main(int argc, char *argv[])
        COMPAT_TEST_FUNC(ctdb_public_ip_list)();
        COMPAT_TEST_FUNC(ctdb_node_and_flags)();
        COMPAT_TEST_FUNC(ctdb_node_map)();
+       COMPAT_TEST_FUNC(ctdb_script)();
 
        return 0;
 }
index 17759181fe547d50cf8a68ae6773c6c545b98d18..435d89281f9944b0820d758ed13b06c533abae7c 100644 (file)
@@ -74,7 +74,7 @@ PROTOCOL_TYPE3_TEST(struct ctdb_public_ip, ctdb_public_ip);
 PROTOCOL_TYPE3_TEST(struct ctdb_public_ip_list, ctdb_public_ip_list);
 PROTOCOL_TYPE3_TEST(struct ctdb_node_and_flags, ctdb_node_and_flags);
 PROTOCOL_TYPE3_TEST(struct ctdb_node_map, ctdb_node_map);
-DEFINE_TEST(struct ctdb_script, ctdb_script);
+PROTOCOL_TYPE3_TEST(struct ctdb_script, ctdb_script);
 DEFINE_TEST(struct ctdb_script_list, ctdb_script_list);
 DEFINE_TEST(struct ctdb_ban_state, ctdb_ban_state);
 DEFINE_TEST(struct ctdb_notify_data, ctdb_notify_data);