From: Jim Meyering Date: Mon, 26 May 2008 14:25:28 +0000 (+0200) Subject: avoid unaligned access errors, e.g., on sparc X-Git-Tag: v0.1~7342 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=e341e7caaea9a3fd5f311195b023af8d280944fa;p=gnulib.git avoid unaligned access errors, e.g., on sparc * lib/sha512.c (sha512_conclude_ctx): Use set_uint64 rather than direct access through a possibly-unaligned uint64* pointer. * lib/sha256.c (sha256_conclude_ctx): Use set_uint32 rather than direct access through a possibly-unaligned uint32* pointer. Prompted by this patch from Tom "spot" Callaway: http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/13638 --- diff --git a/ChangeLog b/ChangeLog index 32655cb6b..9aea4e6b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-05-26 Jim Meyering + avoid unaligned access errors, e.g., on sparc + * lib/sha512.c (sha512_conclude_ctx): Use set_uint64 rather than + direct access through a possibly-unaligned uint64* pointer. + * lib/sha256.c (sha256_conclude_ctx): Use set_uint32 rather than + direct access through a possibly-unaligned uint32* pointer. + Prompted by this patch from Tom "spot" Callaway: + http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/13638 + sha512.c: fix typo in comment * lib/sha512.c (sha512_conclude_ctx): Length is 128-bit, not 64-bit. diff --git a/lib/sha256.c b/lib/sha256.c index 4a632c9fb..a1362caec 100644 --- a/lib/sha256.c +++ b/lib/sha256.c @@ -134,9 +134,13 @@ sha256_conclude_ctx (struct sha256_ctx *ctx) if (ctx->total[0] < bytes) ++ctx->total[1]; - /* Put the 64-bit file length in *bits* at the end of the buffer. */ - ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); - ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); + /* Put the 64-bit file length in *bits* at the end of the buffer. + Use set_uint32 rather than a simple assignment, to avoid risk of + unaligned access. */ + set_uint32 ((char *) &ctx->buffer[size - 2], + SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29))); + set_uint32 ((char *) &ctx->buffer[size - 1], + SWAP (ctx->total[0] << 3)); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); diff --git a/lib/sha512.c b/lib/sha512.c index 66cfaa9bf..261a7bb02 100644 --- a/lib/sha512.c +++ b/lib/sha512.c @@ -141,10 +141,14 @@ sha512_conclude_ctx (struct sha512_ctx *ctx) if (u64lt (ctx->total[0], u64lo (bytes))) ctx->total[1] = u64plus (ctx->total[1], u64lo (1)); - /* Put the 128-bit file length in *bits* at the end of the buffer. */ - ctx->buffer[size - 2] = SWAP (u64or (u64shl (ctx->total[1], 3), - u64shr (ctx->total[0], 61))); - ctx->buffer[size - 1] = SWAP (u64shl (ctx->total[0], 3)); + /* Put the 128-bit file length in *bits* at the end of the buffer. + Use set_uint64 rather than a simple assignment, to avoid risk of + unaligned access. */ + set_uint64 ((char *) &ctx->buffer[size - 2], + SWAP (u64or (u64shl (ctx->total[1], 3), + u64shr (ctx->total[0], 61)))); + set_uint64 ((char *) &ctx->buffer[size - 1], + SWAP (u64shl (ctx->total[0], 3))); memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);