crypto: shash - Fix alignment in unaligned operations
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 14 Jul 2009 13:43:56 +0000 (21:43 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 14 Jul 2009 13:43:56 +0000 (21:43 +0800)
When we encounter an unaligned pointer we are supposed to copy
it to a temporary aligned location.  However the temporary buffer
isn't aligned properly.  This patch fixes that.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/shash.c

index e543283..171c8f0 100644 (file)
@@ -76,8 +76,9 @@ static int shash_update_unaligned(struct shash_desc *desc, const u8 *data,
        unsigned long alignmask = crypto_shash_alignmask(tfm);
        unsigned int unaligned_len = alignmask + 1 -
                                     ((unsigned long)data & alignmask);
        unsigned long alignmask = crypto_shash_alignmask(tfm);
        unsigned int unaligned_len = alignmask + 1 -
                                     ((unsigned long)data & alignmask);
-       u8 buf[shash_align_buffer_size(unaligned_len, alignmask)]
+       u8 ubuf[shash_align_buffer_size(unaligned_len, alignmask)]
                __attribute__ ((aligned));
                __attribute__ ((aligned));
+       u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
        int err;
 
        if (unaligned_len > len)
        int err;
 
        if (unaligned_len > len)
@@ -111,8 +112,9 @@ static int shash_final_unaligned(struct shash_desc *desc, u8 *out)
        unsigned long alignmask = crypto_shash_alignmask(tfm);
        struct shash_alg *shash = crypto_shash_alg(tfm);
        unsigned int ds = crypto_shash_digestsize(tfm);
        unsigned long alignmask = crypto_shash_alignmask(tfm);
        struct shash_alg *shash = crypto_shash_alg(tfm);
        unsigned int ds = crypto_shash_digestsize(tfm);
-       u8 buf[shash_align_buffer_size(ds, alignmask)]
+       u8 ubuf[shash_align_buffer_size(ds, alignmask)]
                __attribute__ ((aligned));
                __attribute__ ((aligned));
+       u8 *buf = PTR_ALIGN(&ubuf[0], alignmask + 1);
        int err;
 
        err = shash->final(desc, buf);
        int err;
 
        err = shash->final(desc, buf);