diff options
author | Amitay Isaacs <amitay@gmail.com> | 2017-07-21 15:21:01 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2017-08-30 14:59:26 +0200 |
commit | 3f2495a4ebfac9de1e566dbe2263a79d97e229c5 (patch) | |
tree | c173e18dd88bc9d1992e24f921d146815190bbbf /ctdb/protocol | |
parent | 582ebec08e2920a4fbaf4f2f80b82ed5148fd435 (diff) | |
download | samba-3f2495a4ebfac9de1e566dbe2263a79d97e229c5.tar.gz |
ctdb-protocol: Fix marshalling for ctdb_req_message_data
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Diffstat (limited to 'ctdb/protocol')
-rw-r--r-- | ctdb/protocol/protocol_message.c | 69 |
1 files changed, 29 insertions, 40 deletions
diff --git a/ctdb/protocol/protocol_message.c b/ctdb/protocol/protocol_message.c index f254ed19408..19c1f162d0c 100644 --- a/ctdb/protocol/protocol_message.c +++ b/ctdb/protocol/protocol_message.c @@ -27,12 +27,6 @@ #include "protocol_api.h" #include "protocol_private.h" -struct ctdb_req_message_wire { - struct ctdb_req_header hdr; - uint64_t srvid; - uint32_t datalen; - uint8_t data[1]; -}; static size_t ctdb_message_data_len(union ctdb_message_data *mdata, uint64_t srvid) @@ -403,30 +397,33 @@ int ctdb_req_message_pull(uint8_t *buf, size_t buflen, size_t ctdb_req_message_data_len(struct ctdb_req_header *h, struct ctdb_req_message_data *c) { - return offsetof(struct ctdb_req_message_wire, data) + - ctdb_tdb_data_len(&c->data); + return ctdb_req_header_len(h) + + ctdb_uint64_len(&c->srvid) + + ctdb_tdb_datan_len(&c->data); } int ctdb_req_message_data_push(struct ctdb_req_header *h, - struct ctdb_req_message_data *message, + struct ctdb_req_message_data *c, uint8_t *buf, size_t *buflen) { - struct ctdb_req_message_wire *wire = - (struct ctdb_req_message_wire *)buf; - size_t length, np; + size_t offset = 0, np; + size_t length; - length = ctdb_req_message_data_len(h, message); + length = ctdb_req_message_data_len(h, c); if (*buflen < length) { *buflen = length; return EMSGSIZE; } h->length = *buflen; - ctdb_req_header_push(h, (uint8_t *)&wire->hdr, &np); + ctdb_req_header_push(h, buf+offset, &np); + offset += np; - wire->srvid = message->srvid; - wire->datalen = ctdb_tdb_data_len(&message->data); - ctdb_tdb_data_push(&message->data, wire->data, &np); + ctdb_uint64_push(&c->srvid, buf+offset, &np); + offset += np; + + ctdb_tdb_datan_push(&c->data, buf+offset, &np); + offset += np; return 0; } @@ -436,40 +433,32 @@ int ctdb_req_message_data_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx, struct ctdb_req_message_data *c) { - struct ctdb_req_message_wire *wire = - (struct ctdb_req_message_wire *)buf; - size_t length, np; + struct ctdb_req_header header; + size_t offset = 0, np; int ret; - length = offsetof(struct ctdb_req_message_wire, data); - if (buflen < length) { - return EMSGSIZE; - } - if (wire->datalen > buflen) { - return EMSGSIZE; - } - if (length + wire->datalen < length) { - return EMSGSIZE; - } - if (buflen < length + wire->datalen) { - return EMSGSIZE; + ret = ctdb_req_header_pull(buf+offset, buflen-offset, &header, &np); + if (ret != 0) { + return ret; } + offset += np; if (h != NULL) { - ret = ctdb_req_header_pull((uint8_t *)&wire->hdr, buflen, h, - &np); - if (ret != 0) { - return ret; - } + *h = header; } - c->srvid = wire->srvid; + ret = ctdb_uint64_pull(buf+offset, buflen-offset, &c->srvid, &np); + if (ret != 0) { + return ret; + } + offset += np; - ret = ctdb_tdb_data_pull(wire->data, wire->datalen, - mem_ctx, &c->data, &np); + ret = ctdb_tdb_datan_pull(buf+offset, buflen-offset, + mem_ctx, &c->data, &np); if (ret != 0) { return ret; } + offset += np; return 0; } |