diff options
author | pjd <pjd@FreeBSD.org> | 2006-03-30 14:41:13 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2006-03-30 14:41:13 +0000 |
commit | 2a7268cfd4de3986d8ab37643fd82828026c3a18 (patch) | |
tree | 7b21c85282ba296a9484fe774b36ff03209b7eeb /sys/geom | |
parent | 148e4e97f6a72d5d47fc4da833170bd0aeb91c52 (diff) | |
download | FreeBSD-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.h | 8 |
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); |