Herbert Xu <herb...@gondor.apana.org.au> wrote:
> 
> crypto: padlock-sha - Fix stack alignment
> 
> The PadLock hardware requires the output buffer for SHA to be
> 128-bit aligned.  We currentply place the buffer on the stack,
> and ask gcc to align it to 128 bits.  That doesn't work on i386
> because the kernel stack is only aligned to 32 bits.  This patch
> changes the code to align the buffer by hand so that the hardware
> doesn't fault on unaligned buffers.
> 
> Reported-by: Séguier Régis <rgu...@e-teleport.net>
> Tested-by: Séguier Régis <rgu...@e-teleport.net>
> Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>

For the record I modified the patch slightly to ensure that
we get the minimum alignment from gcc.

diff --git a/drivers/crypto/padlock-sha.c b/drivers/crypto/padlock-sha.c
index fe007b6..0af8057 100644
--- a/drivers/crypto/padlock-sha.c
+++ b/drivers/crypto/padlock-sha.c
@@ -70,7 +70,8 @@ static int padlock_sha1_finup(struct shash_desc *desc, const 
u8 *in,
        /* We can't store directly to *out as it may be unaligned. */
        /* BTW Don't reduce the buffer size below 128 Bytes!
         *     PadLock microcode needs it that big. */
-       char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN];
+       char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN] __attribute__
+               ((aligned(STACK_ALIGN)));
        char *result = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT);
        struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
        struct sha1_state state;
@@ -135,7 +136,8 @@ static int padlock_sha256_finup(struct shash_desc *desc, 
const u8 *in,
        /* We can't store directly to *out as it may be unaligned. */
        /* BTW Don't reduce the buffer size below 128 Bytes!
         *     PadLock microcode needs it that big. */
-       char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN];
+       char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN] __attribute__
+               ((aligned(STACK_ALIGN)));
        char *result = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT);
        struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
        struct sha256_state state;

-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to