ctdb-daemon: Fix valgrind invalid read error in db_statistics control
authorAmitay Isaacs <amitay@gmail.com>
Thu, 9 Jul 2015 04:55:59 +0000 (14:55 +1000)
committerAmitay Isaacs <amitay@samba.org>
Fri, 10 Jul 2015 18:36:24 +0000 (20:36 +0200)
  ==20761== Invalid read of size 8
  ==20761==    at 0x11BE30: ctdb_ctrl_dbstatistics (ctdb_client.c:1286)
  ==20761==    by 0x12BA89: control_dbstatistics (ctdb.c:713)
  ==20761==    by 0x1312E0: main (ctdb.c:6543)
  ==20761==  Address 0x713b0d0 is 0 bytes after a block of size 560 alloc'd
  ==20761==    at 0x4C27A2E: malloc (vg_replace_malloc.c:270)
  ==20761==    by 0x5CB0954: _talloc_memdup (talloc.c:615)
  ==20761==    by 0x11395C: ctdb_control_recv (ctdb_client.c:1146)
  ==20761==    by 0x11BDD7: ctdb_ctrl_dbstatistics (ctdb_client.c:1265)
  ==20761==    by 0x12BA89: control_dbstatistics (ctdb.c:713)
  ==20761==    by 0x1312E0: main (ctdb.c:6543)

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/client/ctdb_client.c
ctdb/server/ctdb_ltdb_server.c

index 5bf3a68855eedabe0ca87c5be5c687f3dd72a67f..d2c26275e0ba4a800a4b952b86ee65a731ff7eb7 100644 (file)
@@ -1283,7 +1283,7 @@ int ctdb_ctrl_dbstatistics(struct ctdb_context *ctdb, uint32_t destnode, uint32_
        }
 
        wire = (struct ctdb_db_statistics *)outdata.dptr;
-       *s = *wire;
+       memcpy(s, wire, offsetof(struct ctdb_db_statistics, hot_keys_wire));
        ptr = &wire->hot_keys_wire[0];
        for (i=0; i<wire->num_hot_keys; i++) {
                s->hot_keys[i].key.dptr = talloc_size(mem_ctx, s->hot_keys[i].key.dsize);
index c94e1d5c253337f618a348c32469cbcdaba535b5..5357c6c7f16631e89bf96529a777ab447c296e9b 100644 (file)
@@ -1627,7 +1627,8 @@ int32_t ctdb_control_get_db_statistics(struct ctdb_context *ctdb,
                return -1;
        }
 
-       *stats = ctdb_db->statistics;
+       memcpy(stats, &ctdb_db->statistics,
+              offsetof(struct ctdb_db_statistics, hot_keys_wire));
 
        stats->num_hot_keys = MAX_HOT_KEYS;