From: Brian Behlendorf Date: Tue, 7 Jan 2014 22:24:37 +0000 (+0100) Subject: Fix nvlist 'Bus Error' for Sparc X-Git-Tag: zfs-0.6.3~121 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aa0218d6a12814fac50b287214f9f3b0b99e11b1;p=zfs Fix nvlist 'Bus Error' for Sparc The mis-aligned memory accesses in nvpair_native_embedded() and nvpair_native_embedded_array() will cause a 'Bus Error' for architectures such as Sparc which not fully byte addressible. To avoid this issue care is taken to avoid dereferencing the potentially mis-aligned packed nvlist_t. Signed-off-by: Brian Behlendorf Signed-off-by: Ned Bass Signed-off-by: marku89 Issue #1700 --- diff --git a/module/nvpair/nvpair.c b/module/nvpair/nvpair.c index 550356c58..f5c31663a 100644 --- a/module/nvpair/nvpair.c +++ b/module/nvpair/nvpair.c @@ -2580,7 +2580,8 @@ nvpair_native_embedded(nvstream_t *nvs, nvpair_t *nvp) * structure. The address may not be aligned, so we have * to use bzero. */ - bzero(&packed->nvl_priv, sizeof (packed->nvl_priv)); + bzero((char *)packed + offsetof(nvlist_t, nvl_priv), + sizeof (uint64_t)); } return (nvs_embedded(nvs, EMBEDDED_NVL(nvp))); @@ -2608,7 +2609,8 @@ nvpair_native_embedded_array(nvstream_t *nvs, nvpair_t *nvp) * packed structure. The address may not be aligned, * so we have to use bzero. */ - bzero(&packed->nvl_priv, sizeof (packed->nvl_priv)); + bzero((char *)packed + offsetof(nvlist_t, nvl_priv), + sizeof (uint64_t)); } return (nvs_embedded_nvl_array(nvs, nvp, NULL));