Browse Source

[ARM] Fix csumpartial corner case

Ji-In Park discovered a bug in csumpartial which caused wrong
checksums with misaligned buffers.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Russell King 19 years ago
parent
commit
af36bef0c5
1 changed files with 4 additions and 0 deletions
  1. 4 0
      arch/arm/lib/csumpartial.S

+ 4 - 0
arch/arm/lib/csumpartial.S

@@ -39,6 +39,7 @@ td3	.req	lr
 
 
 		/* we must have at least one byte. */
 		/* we must have at least one byte. */
 		tst	buf, #1			@ odd address?
 		tst	buf, #1			@ odd address?
+		movne	sum, sum, ror #8
 		ldrneb	td0, [buf], #1
 		ldrneb	td0, [buf], #1
 		subne	len, len, #1
 		subne	len, len, #1
 		adcnes	sum, sum, td0, put_byte_1
 		adcnes	sum, sum, td0, put_byte_1
@@ -103,6 +104,9 @@ ENTRY(csum_partial)
 		cmp	len, #8			@ Ensure that we have at least
 		cmp	len, #8			@ Ensure that we have at least
 		blo	.less8			@ 8 bytes to copy.
 		blo	.less8			@ 8 bytes to copy.
 
 
+		tst	buf, #1
+		movne	sum, sum, ror #8
+
 		adds	sum, sum, #0		@ C = 0
 		adds	sum, sum, #0		@ C = 0
 		tst	buf, #3			@ Test destination alignment
 		tst	buf, #3			@ Test destination alignment
 		blne	.not_aligned		@ aligh destination, return here
 		blne	.not_aligned		@ aligh destination, return here