cbc128.c: fix strict aliasing warning.
authorAndy Polyakov <appro@openssl.org>
Mon, 5 Nov 2012 10:04:02 +0000 (10:04 +0000)
committerBen Laurie <ben@links.org>
Tue, 4 Jun 2013 13:30:49 +0000 (14:30 +0100)
crypto/modes/cbc128.c

index 3d3782c..34b2a2e 100644 (file)
@@ -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);
                        }
                }
        }