From c0832990f54e8c01c00931761e9c1db09cab469c Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Mon, 5 Nov 2012 10:04:02 +0000 Subject: [PATCH] cbc128.c: fix strict aliasing warning. --- crypto/modes/Makefile | 2 -- crypto/modes/cbc128.c | 22 +++++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/crypto/modes/Makefile b/crypto/modes/Makefile index 566e8f795d..811969304f 100644 --- a/crypto/modes/Makefile +++ b/crypto/modes/Makefile @@ -16,8 +16,6 @@ CFLAGS= $(INCLUDES) $(CFLAG) ASFLAGS= $(INCLUDES) $(ASFLAG) AFLAGS= $(ASFLAGS) -CFLAGS += -fno-strict-aliasing - GENERAL=Makefile TEST= APPS= diff --git a/crypto/modes/cbc128.c b/crypto/modes/cbc128.c index 3d3782cbe1..34b2a2ef21 100644 --- a/crypto/modes/cbc128.c +++ b/crypto/modes/cbc128.c @@ -117,7 +117,7 @@ void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, unsigned char ivec[16], block128_f block) { size_t n; - union { size_t align; unsigned char c[16]; } tmp; + union { size_t t[16/sizeof(size_t)]; unsigned char c[16]; } tmp; assert(in && out && key && ivec); @@ -165,19 +165,19 @@ void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, out += 16; } } - else { - size_t c; + else if (16%sizeof(size_t) == 0) { /* always true */ + size_t c, *out_t=(size_t *)out, *ivec_t=(size_t *)ivec; + const size_t *in_t=(const size_t *)in; while (len>=16) { - (*block)(in, tmp.c, key); - for(n=0; n<16; n+=sizeof(size_t)) { - c = *(size_t *)(in+n); - *(size_t *)(out+n) = - *(size_t *)(tmp.c+n) ^ *(size_t *)(ivec+n); - *(size_t *)(ivec+n) = c; + (*block)((const unsigned char *)in_t, tmp.c, key); + for(n=0; n<16/sizeof(size_t); n++) { + c = in_t[n]; + out_t[n] = tmp.t[n] ^ ivec_t[n]; + ivec_t[n] = c; } len -= 16; - in += 16; - out += 16; + in_t += 16/sizeof(size_t); + out_t += 16/sizeof(size_t); } } } -- 2.40.0