mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
sparc32: Fixed unaligned memory copying in function __csum_partial_copy_sparc_generic
When we are in the label cc_dword_align, registers %o0 and %o1 have the same last 2 bits, but it's not guaranteed one of them is zero. So we can get unaligned memory access in label ccte. Example of parameters which lead to this: %o0=0x7ff183e9, %o1=0x8e709e7d, %g1=3 With the parameters I had a memory corruption, when the additional 5 bytes were rewritten. This patch corrects the error. One comment to the patch. We don't care about the third bit in %o1, because cc_end_cruft stores word or less. Signed-off-by: Tkhai Kirill <tkhai@yandex.ru> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f486b3dc2d
commit
b1054282d7
1 changed files with 9 additions and 3 deletions
|
@ -289,10 +289,16 @@ cc_end_cruft:
|
|||
|
||||
/* Also, handle the alignment code out of band. */
|
||||
cc_dword_align:
|
||||
cmp %g1, 6
|
||||
bl,a ccte
|
||||
cmp %g1, 16
|
||||
bge 1f
|
||||
srl %g1, 1, %o3
|
||||
2: cmp %o3, 0
|
||||
be,a ccte
|
||||
andcc %g1, 0xf, %o3
|
||||
andcc %o0, 0x1, %g0
|
||||
andcc %o3, %o0, %g0 ! Check %o0 only (%o1 has the same last 2 bits)
|
||||
be,a 2b
|
||||
srl %o3, 1, %o3
|
||||
1: andcc %o0, 0x1, %g0
|
||||
bne ccslow
|
||||
andcc %o0, 0x2, %g0
|
||||
be 1f
|
||||
|
|
Loading…
Reference in a new issue