diff options
author | Andrey Ryabinin <aryabinin@virtuozzo.com> | 2017-10-16 11:51:31 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-11-03 09:35:35 -0400 |
commit | d041b557792c85677f17e08eee535eafbd6b9aa2 (patch) | |
tree | 742eabbecc54216d4acb6f7ed0e06cb6cea622d9 | |
parent | 5dfeaac15f2b1abb5a53c9146041c7235eb9aa04 (diff) |
crypto: x86/sha1-mb - fix panic due to unaligned access
struct sha1_ctx_mgr allocated in sha1_mb_mod_init() via kzalloc()
and later passed in sha1_mb_flusher_mgr_flush_avx2() function where
instructions vmovdqa used to access the struct. vmovdqa requires
16-bytes aligned argument, but nothing guarantees that struct
sha1_ctx_mgr will have that alignment. Unaligned vmovdqa will
generate GP fault.
Fix this by replacing vmovdqa with vmovdqu which doesn't have alignment
requirements.
Fixes: 2249cbb53ead ("crypto: sha-mb - SHA1 multibuffer submit and flush routines for AVX2")
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S index 93b945597ecf..7cfba738f104 100644 --- a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S +++ b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | |||
@@ -157,8 +157,8 @@ LABEL skip_ %I | |||
157 | .endr | 157 | .endr |
158 | 158 | ||
159 | # Find min length | 159 | # Find min length |
160 | vmovdqa _lens+0*16(state), %xmm0 | 160 | vmovdqu _lens+0*16(state), %xmm0 |
161 | vmovdqa _lens+1*16(state), %xmm1 | 161 | vmovdqu _lens+1*16(state), %xmm1 |
162 | 162 | ||
163 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 163 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
164 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 164 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |
@@ -178,8 +178,8 @@ LABEL skip_ %I | |||
178 | vpsubd %xmm2, %xmm0, %xmm0 | 178 | vpsubd %xmm2, %xmm0, %xmm0 |
179 | vpsubd %xmm2, %xmm1, %xmm1 | 179 | vpsubd %xmm2, %xmm1, %xmm1 |
180 | 180 | ||
181 | vmovdqa %xmm0, _lens+0*16(state) | 181 | vmovdqu %xmm0, _lens+0*16(state) |
182 | vmovdqa %xmm1, _lens+1*16(state) | 182 | vmovdqu %xmm1, _lens+1*16(state) |
183 | 183 | ||
184 | # "state" and "args" are the same address, arg1 | 184 | # "state" and "args" are the same address, arg1 |
185 | # len is arg2 | 185 | # len is arg2 |
@@ -235,8 +235,8 @@ ENTRY(sha1_mb_mgr_get_comp_job_avx2) | |||
235 | jc .return_null | 235 | jc .return_null |
236 | 236 | ||
237 | # Find min length | 237 | # Find min length |
238 | vmovdqa _lens(state), %xmm0 | 238 | vmovdqu _lens(state), %xmm0 |
239 | vmovdqa _lens+1*16(state), %xmm1 | 239 | vmovdqu _lens+1*16(state), %xmm1 |
240 | 240 | ||
241 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 241 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
242 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 242 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |