From: Al Viro > Sent: 22 October 2023 20:40 .... > We need a way for csum_and_copy_{from,to}_user() to report faults. > The approach taken back in 2020 (avoid 0 as return value by starting > summing from ~0U, use 0 to report faults) had been broken; it does > yield the right value modulo 2^16-1, but the case when data is > entirely zero-filled is not handled right. It almost works, since > for most of the codepaths we have a non-zero value added in > and there 0 is not different from anything divisible by 0xffff. > However, there are cases (ICMPv4 replies, for example) where we > are not guaranteed that. > > In other words, we really need to have those primitives return 0 > on filled-with-zeroes input. So let's make them return a 64bit > value instead; we can do that cheaply (all supported architectures > do that via a couple of registers) and we can use that to report > faults without disturbing the 32bit csum. Does the ICMPv4 sum need to be zero if all zeros but 0xffff if there are non-zero bytes in there? IIRC the original buggy case was fixed by returning 0xffff for the all-zero buffer. Even if it does then it would seem more sensible to have the checksum function never return zero, csum_and_copy() return zero on fault and add extra code to the (unusual) ICMP reply code to detect 0xffff and convert to zero if the buffer is all zeros. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)