From: Amitay Isaacs Date: Thu, 13 Jul 2017 05:15:25 +0000 (+1000) Subject: ctdb-protocol: Fix marshalling for ctdb_server_id X-Git-Tag: ldb-1.2.2~87 X-Git-Url: http://git.samba.org/samba.git/?a=commitdiff_plain;h=a0bce370894df7e70205ce634da236b7a16824ee;p=garming%2Fsamba-autobuild%2F.git ctdb-protocol: Fix marshalling for ctdb_server_id Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- diff --git a/ctdb/protocol/protocol_api.h b/ctdb/protocol/protocol_api.h index 6d213708b96..753a08ce598 100644 --- a/ctdb/protocol/protocol_api.h +++ b/ctdb/protocol/protocol_api.h @@ -58,10 +58,11 @@ int ctdb_rec_buffer_write(struct ctdb_rec_buffer *recbuf, int fd); int ctdb_rec_buffer_read(int fd, TALLOC_CTX *mem_ctx, struct ctdb_rec_buffer **out); -size_t ctdb_server_id_len(struct ctdb_server_id *sid); -void ctdb_server_id_push(struct ctdb_server_id *sid, uint8_t *buf); +size_t ctdb_server_id_len(struct ctdb_server_id *in); +void ctdb_server_id_push(struct ctdb_server_id *in, uint8_t *buf, + size_t *npush); int ctdb_server_id_pull(uint8_t *buf, size_t buflen, - struct ctdb_server_id *sid); + struct ctdb_server_id *out, size_t *npull); size_t ctdb_g_lock_len(struct ctdb_g_lock *lock); void ctdb_g_lock_push(struct ctdb_g_lock *lock, uint8_t *buf); diff --git a/ctdb/protocol/protocol_types.c b/ctdb/protocol/protocol_types.c index e375b44184a..a95795b5156 100644 --- a/ctdb/protocol/protocol_types.c +++ b/ctdb/protocol/protocol_types.c @@ -4861,24 +4861,66 @@ fail: return ret; } -size_t ctdb_server_id_len(struct ctdb_server_id *sid) +size_t ctdb_server_id_len(struct ctdb_server_id *in) { - return sizeof(struct ctdb_server_id); + return ctdb_uint64_len(&in->pid) + + ctdb_uint32_len(&in->task_id) + + ctdb_uint32_len(&in->vnn) + + ctdb_uint64_len(&in->unique_id); } -void ctdb_server_id_push(struct ctdb_server_id *sid, uint8_t *buf) +void ctdb_server_id_push(struct ctdb_server_id *in, uint8_t *buf, + size_t *npush) { - memcpy(buf, sid, sizeof(struct ctdb_server_id)); + size_t offset = 0, np; + + ctdb_uint64_push(&in->pid, buf+offset, &np); + offset += np; + + ctdb_uint32_push(&in->task_id, buf+offset, &np); + offset += np; + + ctdb_uint32_push(&in->vnn, buf+offset, &np); + offset += np; + + ctdb_uint64_push(&in->unique_id, buf+offset, &np); + offset += np; + + *npush = offset; } int ctdb_server_id_pull(uint8_t *buf, size_t buflen, - struct ctdb_server_id *sid) + struct ctdb_server_id *out, size_t *npull) { - if (buflen < sizeof(struct ctdb_server_id)) { - return EMSGSIZE; + size_t offset = 0, np; + int ret; + + ret = ctdb_uint64_pull(buf+offset, buflen-offset, &out->pid, &np); + if (ret != 0) { + return ret; } + offset += np; + + ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->task_id, &np); + if (ret != 0) { + return ret; + } + offset += np; + + ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->vnn, &np); + if (ret != 0) { + return ret; + } + offset += np; - memcpy(sid, buf, sizeof(struct ctdb_server_id)); + ret = ctdb_uint64_pull(buf+offset, buflen-offset, &out->unique_id, + &np); + if (ret != 0) { + return ret; + } + offset += np; + + *npull = offset; return 0; } diff --git a/ctdb/tests/src/protocol_common.c b/ctdb/tests/src/protocol_common.c index 015a3b78adc..1a74104174e 100644 --- a/ctdb/tests/src/protocol_common.c +++ b/ctdb/tests/src/protocol_common.c @@ -1332,7 +1332,7 @@ void verify_ctdb_disable_message(struct ctdb_disable_message *p1, assert(p1->timeout == p2->timeout); } -void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p) +void fill_ctdb_server_id(struct ctdb_server_id *p) { p->pid = rand64(); p->task_id = rand32(); @@ -1352,7 +1352,7 @@ void verify_ctdb_server_id(struct ctdb_server_id *p1, void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p) { p->type = rand_int(2); - fill_ctdb_server_id(mem_ctx, &p->sid); + fill_ctdb_server_id(&p->sid); } void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2) diff --git a/ctdb/tests/src/protocol_common.h b/ctdb/tests/src/protocol_common.h index 4186a92785c..a14631c5f13 100644 --- a/ctdb/tests/src/protocol_common.h +++ b/ctdb/tests/src/protocol_common.h @@ -358,7 +358,7 @@ void fill_ctdb_disable_message(TALLOC_CTX *mem_ctx, void verify_ctdb_disable_message(struct ctdb_disable_message *p1, struct ctdb_disable_message *p2); -void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p); +void fill_ctdb_server_id(struct ctdb_server_id *p); void verify_ctdb_server_id(struct ctdb_server_id *p1, struct ctdb_server_id *p2); diff --git a/ctdb/tests/src/protocol_types_compat_test.c b/ctdb/tests/src/protocol_types_compat_test.c index 509550527e9..53ed0e9aab4 100644 --- a/ctdb/tests/src/protocol_types_compat_test.c +++ b/ctdb/tests/src/protocol_types_compat_test.c @@ -2167,6 +2167,27 @@ static int ctdb_disable_message_pull_old(uint8_t *buf, size_t buflen, return 0; } +static size_t ctdb_server_id_len_old(struct ctdb_server_id *in) +{ + return sizeof(struct ctdb_server_id); +} + +static void ctdb_server_id_push_old(struct ctdb_server_id *in, uint8_t *buf) +{ + memcpy(buf, in, sizeof(struct ctdb_server_id)); +} + +static int ctdb_server_id_pull_old(uint8_t *buf, size_t buflen, + struct ctdb_server_id *out) +{ + if (buflen < sizeof(struct ctdb_server_id)) { + return EMSGSIZE; + } + + memcpy(out, buf, sizeof(struct ctdb_server_id)); + return 0; +} + COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics); COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map); @@ -2211,6 +2232,8 @@ COMPAT_TYPE3_TEST(struct ctdb_election_message, ctdb_election_message); COMPAT_TYPE3_TEST(struct ctdb_srvid_message, ctdb_srvid_message); COMPAT_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message); +COMPAT_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id); + int main(int argc, char *argv[]) { if (argc == 2) { @@ -2258,6 +2281,7 @@ int main(int argc, char *argv[]) COMPAT_TEST_FUNC(ctdb_election_message)(); COMPAT_TEST_FUNC(ctdb_srvid_message)(); COMPAT_TEST_FUNC(ctdb_disable_message)(); + COMPAT_TEST_FUNC(ctdb_server_id)(); return 0; } diff --git a/ctdb/tests/src/protocol_types_test.c b/ctdb/tests/src/protocol_types_test.c index a8660c9f24e..08312ef8702 100644 --- a/ctdb/tests/src/protocol_types_test.c +++ b/ctdb/tests/src/protocol_types_test.c @@ -87,6 +87,7 @@ PROTOCOL_TYPE3_TEST(struct ctdb_db_statistics, ctdb_db_statistics); PROTOCOL_TYPE3_TEST(struct ctdb_election_message, ctdb_election_message); PROTOCOL_TYPE3_TEST(struct ctdb_srvid_message, ctdb_srvid_message); PROTOCOL_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message); +PROTOCOL_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id); DEFINE_TEST(struct ctdb_g_lock_list, ctdb_g_lock_list); static void test_ctdb_rec_buffer_read_write(void) @@ -187,6 +188,7 @@ int main(int argc, char *argv[]) TEST_FUNC(ctdb_election_message)(); TEST_FUNC(ctdb_srvid_message)(); TEST_FUNC(ctdb_disable_message)(); + TEST_FUNC(ctdb_server_id)(); TEST_FUNC(ctdb_g_lock_list)(); test_ctdb_rec_buffer_read_write();