Skip to content

Commit 4b75b12

Browse files
groeckhdeller
authored andcommitted
parisc: Fix csum_ipv6_magic on 64-bit systems
hppa 64-bit systems calculates the IPv6 checksum using 64-bit add operations. The last add folds protocol and length fields into the 64-bit result. While unlikely, this operation can overflow. The overflow can be triggered with a code sequence such as the following. /* try to trigger massive overflows */ memset(tmp_buf, 0xff, sizeof(struct in6_addr)); csum_result = csum_ipv6_magic((struct in6_addr *)tmp_buf, (struct in6_addr *)tmp_buf, 0xffff, 0xff, 0xffffffff); Fix the problem by adding any overflows from the final add operation into the calculated checksum. Fortunately, we can do this without additional cost by replacing the add operation used to fold the checksum into 32 bit with "add,dc" to add in the missing carry. Cc: Palmer Dabbelt <palmer@rivosinc.com> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Charlie Jenkins <charlie@rivosinc.com> Tested-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Helge Deller <deller@gmx.de>
1 parent 4408ba7 commit 4b75b12

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/parisc/include/asm/checksum.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
137137
" add,dc %3, %0, %0\n" /* fold in proto+len | carry bit */
138138
" extrd,u %0, 31, 32, %4\n"/* copy upper half down */
139139
" depdi 0, 31, 32, %0\n"/* clear upper half */
140-
" add %4, %0, %0\n" /* fold into 32-bits */
141-
" addc 0, %0, %0\n" /* add carry */
140+
" add,dc %4, %0, %0\n" /* fold into 32-bits, plus carry */
141+
" addc 0, %0, %0\n" /* add final carry */
142142

143143
#else
144144

0 commit comments

Comments
 (0)