ctdb-protocol: Fix marshalling of struct ctdb_addr_info
authorAmitay Isaacs <amitay@gmail.com>
Fri, 6 Nov 2015 02:06:26 +0000 (13:06 +1100)
committerMartin Schwenke <martins@samba.org>
Wed, 25 Nov 2015 09:16:20 +0000 (10:16 +0100)
ctdb_addr_info->iface can be NULL.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Jeremy Allison <jra@samba.org>
ctdb/protocol/protocol_types.c
ctdb/tests/src/protocol_types_test.c

index bb472882e3cc4f6b04d6f9f8bc0a9e17581c366e..d52e945f5be5c8068d20c3454cd3644a5ee2967a 100644 (file)
@@ -1458,8 +1458,14 @@ struct ctdb_addr_info_wire {
 
 size_t ctdb_addr_info_len(struct ctdb_addr_info *arp)
 {
-       return offsetof(struct ctdb_addr_info_wire, iface) +
-              strlen(arp->iface)+1;
+       uint32_t len;
+
+       len = offsetof(struct ctdb_addr_info_wire, iface);
+       if (arp->iface != NULL) {
+              len += strlen(arp->iface)+1;
+       }
+
+       return len;
 }
 
 void ctdb_addr_info_push(struct ctdb_addr_info *addr_info, uint8_t *buf)
@@ -1468,8 +1474,12 @@ void ctdb_addr_info_push(struct ctdb_addr_info *addr_info, uint8_t *buf)
 
        wire->addr = addr_info->addr;
        wire->mask = addr_info->mask;
-       wire->len = strlen(addr_info->iface)+1;
-       memcpy(wire->iface, addr_info->iface, wire->len);
+       if (addr_info->iface == NULL) {
+               wire->len = 0;
+       } else {
+               wire->len = strlen(addr_info->iface)+1;
+               memcpy(wire->iface, addr_info->iface, wire->len);
+       }
 }
 
 int ctdb_addr_info_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
@@ -1493,10 +1503,15 @@ int ctdb_addr_info_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        addr_info->addr = wire->addr;
        addr_info->mask = wire->mask;
 
-       addr_info->iface = talloc_strndup(addr_info, wire->iface, wire->len);
-       if (addr_info->iface == NULL) {
-               talloc_free(addr_info);
-               return ENOMEM;
+       if (wire->len == 0) {
+               addr_info->iface = NULL;
+       } else {
+               addr_info->iface = talloc_strndup(addr_info, wire->iface,
+                                                 wire->len);
+               if (addr_info->iface == NULL) {
+                       talloc_free(addr_info);
+                       return ENOMEM;
+               }
        }
 
        *out = addr_info;
index 4e85315e9a566f9958af6aa9be9cd6b20b55ed3a..b4543248a98073ff8843a21eb18c6375e63092c0 100644 (file)
@@ -556,7 +556,11 @@ static void fill_ctdb_addr_info(TALLOC_CTX *mem_ctx, struct ctdb_addr_info *p)
 {
        fill_ctdb_sock_addr(mem_ctx, &p->addr);
        p->mask = rand_int(33);
-       fill_ctdb_string(mem_ctx, &p->iface);
+       if (rand_int(2) == 0) {
+               p->iface = NULL;
+       } else {
+               fill_ctdb_string(mem_ctx, &p->iface);
+       }
 }
 
 static void verify_ctdb_addr_info(struct ctdb_addr_info *p1,