From 090a96d0a5963bc62efc3354480e277610cab7e6 Mon Sep 17 00:00:00 2001 From: Anand Avati Date: Sun, 7 Feb 2010 04:30:20 +0000 Subject: dht: Remove pointer casting in layout handling Small changes by Anand Avati over original submission: Remove pointer casting (copy data to proper memory before using it). Fixes bug #493. Hello, See bug #493 for more information on this patch. http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=493#c2 This patch assumes that the scope of disk_layout is local wherever it is used. Seems correct, not really checked, though. Greetings, Hraban Luyat Signed-off-by: Hraban Luyat Signed-off-by: Anand V. Avati Signed-off-by: Anand V. Avati BUG: 493 (tcp + dht + armv5tel: ???brick: disk layout has invalid count 29696???) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=493 --- xlators/cluster/dht/src/dht-layout.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'xlators/cluster/dht/src/dht-layout.c') diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index e43be876a..86d3c4410 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -276,15 +276,18 @@ out: int dht_disk_layout_merge (xlator_t *this, dht_layout_t *layout, - int pos, int32_t *disk_layout) + int pos, void *disk_layout_raw) { int cnt = 0; int type = 0; int start_off = 0; int stop_off = 0; + int disk_layout[4]; /* TODO: assert disk_layout_ptr is of required length */ + memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout)); + cnt = ntoh32 (disk_layout[0]); if (cnt != 1) { gf_log (this->name, GF_LOG_DEBUG, @@ -316,7 +319,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, int i = 0; int ret = -1; int err = -1; - int32_t *disk_layout = NULL; + void *disk_layout_raw = NULL; if (op_ret != 0) { @@ -339,7 +342,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, if (xattr) { /* during lookup and not mkdir */ ret = dict_get_ptr (xattr, "trusted.glusterfs.dht", - VOID(&disk_layout)); + &disk_layout_raw); } if (ret != 0) { @@ -351,7 +354,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, goto out; } - ret = dht_disk_layout_merge (this, layout, i, disk_layout); + ret = dht_disk_layout_merge (this, layout, i, disk_layout_raw); if (ret != 0) { gf_log (this->name, GF_LOG_DEBUG, "layout merge from subvolume %s failed", @@ -607,7 +610,8 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, int ret = 0; int err = 0; int dict_ret = 0; - int32_t *disk_layout = NULL; + int32_t disk_layout[4]; + void *disk_layout_raw = NULL; int32_t count = -1; uint32_t start_off = -1; uint32_t stop_off = -1; @@ -641,8 +645,8 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, } dict_ret = dict_get_ptr (xattr, "trusted.glusterfs.dht", - VOID(&disk_layout)); - + &disk_layout_raw); + if (dict_ret < 0) { if (err == 0) { gf_log (this->name, GF_LOG_DEBUG, @@ -650,7 +654,9 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol, ret = -1; } goto out; - } + } + + memcpy (disk_layout, disk_layout_raw, sizeof (disk_layout)); count = ntoh32 (disk_layout[0]); if (count != 1) { -- cgit