Skip to content

Commit

Permalink
arm64: csum: Fix handling of bad packets
Browse files Browse the repository at this point in the history
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: 0e455d8 ("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>
  • Loading branch information
rmurphy-arm authored and willdeacon committed Jul 30, 2020
1 parent 835d1c3 commit 05fb3db
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions arch/arm64/include/asm/checksum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down

0 comments on commit 05fb3db

Please sign in to comment.