summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2006-03-30 14:41:13 +0000
committerpjd <pjd@FreeBSD.org>2006-03-30 14:41:13 +0000
commit2a7268cfd4de3986d8ab37643fd82828026c3a18 (patch)
tree7b21c85282ba296a9484fe774b36ff03209b7eeb /sys/geom
parent148e4e97f6a72d5d47fc4da833170bd0aeb91c52 (diff)
downloadFreeBSD-src-2a7268cfd4de3986d8ab37643fd82828026c3a18.zip
FreeBSD-src-2a7268cfd4de3986d8ab37643fd82828026c3a18.tar.gz
md_hash field in g_eli_metadata structure is not 4 byte aligned, which
case panic on sparc64. The problem is in MD5(9) implementation. The Encode() function takes 'unsigned char *output' as its first argument, which is then assigned to 'u_int32_t *op'. If the 'output' argument is not 4 byte aligned (and in geli(8) case it is not), sparc64 machine will panic. I don't know how to fix MD5(9) in a clean way, so I'm implementing a work-around in geli(8). Reported by: brueffer MFC after: 3 days
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/eli/g_eli.h8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/geom/eli/g_eli.h b/sys/geom/eli/g_eli.h
index 363b38b..4f56b36 100644
--- a/sys/geom/eli/g_eli.h
+++ b/sys/geom/eli/g_eli.h
@@ -159,6 +159,7 @@ static __inline void
eli_metadata_encode(struct g_eli_metadata *md, u_char *data)
{
MD5_CTX ctx;
+ uint32_t hash[4]; /* Need proper aligment here. */
u_char *p;
p = data;
@@ -175,13 +176,15 @@ eli_metadata_encode(struct g_eli_metadata *md, u_char *data)
bcopy(md->md_mkeys, p, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
MD5Init(&ctx);
MD5Update(&ctx, data, p - data);
- MD5Final(md->md_hash, &ctx);
+ MD5Final((u_char *)hash, &ctx);
+ bcopy(hash, md->md_hash, sizeof(md->md_hash));
bcopy(md->md_hash, p, sizeof(md->md_hash));
}
static __inline int
eli_metadata_decode_v0(const u_char *data, struct g_eli_metadata *md)
{
MD5_CTX ctx;
+ uint32_t hash[4]; /* Need proper aligment here. */
const u_char *p;
p = data + sizeof(md->md_magic) + sizeof(md->md_version);
@@ -196,7 +199,8 @@ eli_metadata_decode_v0(const u_char *data, struct g_eli_metadata *md)
bcopy(p, md->md_mkeys, sizeof(md->md_mkeys)); p += sizeof(md->md_mkeys);
MD5Init(&ctx);
MD5Update(&ctx, data, p - data);
- MD5Final(md->md_hash, &ctx);
+ MD5Final((u_char *)hash, &ctx);
+ bcopy(hash, md->md_hash, sizeof(md->md_hash));
if (bcmp(md->md_hash, p, 16) != 0)
return (EINVAL);
return (0);
OpenPOWER on IntegriCloud