ctdb-protocol: Fix marshalling of string with length
authorAmitay Isaacs <amitay@gmail.com>
Tue, 30 Aug 2016 15:33:38 +0000 (01:33 +1000)
committerAmitay Isaacs <amitay@samba.org>
Sun, 18 Dec 2016 13:23:22 +0000 (14:23 +0100)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_types.c

index 04a9d5c4a9bb4c180804cae29a473a7d4b5a80e3..b0e0f3fd2f841efe256ab991d326867fbcf36d91 100644 (file)
@@ -231,19 +231,15 @@ struct stringn_wire {
 
 size_t ctdb_stringn_len(const char *str)
 {
-       return sizeof(uint32_t) + strlen(str) + 1;
+       return sizeof(uint32_t) + ctdb_string_len(str);
 }
 
 void ctdb_stringn_push(const char *str, uint8_t *buf)
 {
        struct stringn_wire *wire = (struct stringn_wire *)buf;
 
-       if (str == NULL) {
-               wire->length = 0;
-       } else {
-               wire->length = strlen(str) + 1;
-               memcpy(wire->str, str, wire->length);
-       }
+       wire->length = ctdb_string_len(str);
+       ctdb_string_push(str, wire->str);
 }
 
 int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
@@ -265,6 +261,11 @@ int ctdb_stringn_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                return EMSGSIZE;
        }
 
+       if (wire->length == 0) {
+               *out = NULL;
+               return 0;
+       }
+
        str = talloc_strndup(mem_ctx, (char *)wire->str, wire->length);
        if (str == NULL) {
                return ENOMEM;