]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
arm64: csum: Fix handling of bad packets
authorRobin Murphy <robin.murphy@arm.com>
Thu, 30 Jul 2020 09:56:49 +0000 (10:56 +0100)
committerWill Deacon <will@kernel.org>
Thu, 30 Jul 2020 16:01:38 +0000 (17:01 +0100)
Although iph is expected to point to at least 20 bytes of valid memory,
ihl may be bogus, for example on reception of a corrupt packet. If it
happens to be less than 5, we really don't want to run away and
dereference 16GB worth of memory until it wraps back to exactly zero...

Fixes: 0e455d8e80aa ("arm64: Implement optimised IP checksum helpers")
Reported-by: guodeqing <geffrey.guo@huawei.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/checksum.h

index b6f7bc6da5fb31f2216d3d6aa3b2f428d66cf3b4..93a161b3bf3fee9476811665296c10d9c3b919a4 100644 (file)
@@ -24,16 +24,17 @@ static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
 {
        __uint128_t tmp;
        u64 sum;
+       int n = ihl; /* we want it signed */
 
        tmp = *(const __uint128_t *)iph;
        iph += 16;
-       ihl -= 4;
+       n -= 4;
        tmp += ((tmp >> 64) | (tmp << 64));
        sum = tmp >> 64;
        do {
                sum += *(const u32 *)iph;
                iph += 4;
-       } while (--ihl);
+       } while (--n > 0);
 
        sum += ((sum >> 32) | (sum << 32));
        return csum_fold((__force u32)(sum >> 32));