Skip to content

Commit

Permalink
arm64: csum: Fix handling of bad packets
Browse files Browse the repository at this point in the history
[ Upstream commit 05fb3db ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
rmurphy-arm authored and gregkh committed Aug 5, 2020
1 parent 8a90b43 commit 3bb2f52
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 @@ -19,16 +19,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 3bb2f52

Please sign in to comment.