aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2013-06-27 01:03:19 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2013-06-27 01:03:19 +0200
commit1f5e81f8f83087082108cf9449068ec4c2a3125e (patch)
treea3bb9d33dc2da4d68f109aeb18699f5adced15fa
parentf6205c6ab786f14e3515dfc0bfdb958ada8ed0e9 (diff)
downloadbusybox-1f5e81f8f83087082108cf9449068ec4c2a3125e.tar.gz
md5/sha512: a better fix for strict aliasing warnings
The locations *are* well-aligned for direct stores on any architecture. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--include/platform.h1
-rw-r--r--libbb/hash_md5_sha.c6
2 files changed, 4 insertions, 3 deletions
diff --git a/include/platform.h b/include/platform.h
index 917d87dd6..0fa9f6182 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -208,6 +208,7 @@ typedef int bb__aliased_int FIX_ALIASING;
typedef long bb__aliased_long FIX_ALIASING;
typedef uint16_t bb__aliased_uint16_t FIX_ALIASING;
typedef uint32_t bb__aliased_uint32_t FIX_ALIASING;
+typedef uint64_t bb__aliased_uint64_t FIX_ALIASING;
/* NB: unaligned parameter should be a pointer, aligned one -
* a lvalue. This makes it more likely to not swap them by mistake
diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c
index e10cb391d..3f743ac75 100644
--- a/libbb/hash_md5_sha.c
+++ b/libbb/hash_md5_sha.c
@@ -84,7 +84,7 @@ static void FAST_FUNC common64_end(md5_ctx_t *ctx, int swap_needed)
if (swap_needed)
t = bb_bswap_64(t);
/* wbuffer is suitably aligned for this */
- memcpy(&ctx->wbuffer[64 - 8], &t, sizeof(t));
+ *(bb__aliased_uint64_t *) (&ctx->wbuffer[64 - 8]) = t;
}
ctx->process_block(ctx);
if (remaining >= 8)
@@ -883,10 +883,10 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf)
uint64_t t;
t = ctx->total64[0] << 3;
t = SWAP_BE64(t);
- memcpy(&ctx->wbuffer[128 - 8], &t, sizeof(t));
+ *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 8]) = t;
t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61);
t = SWAP_BE64(t);
- memcpy(&ctx->wbuffer[128 - 16], &t, sizeof(t));
+ *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 16]) = t;
}
sha512_process_block128(ctx);
if (remaining >= 16)