Skip to content

Commit

Permalink
Fix alignment issue of ones_complement_checksum
Browse files Browse the repository at this point in the history
The ones_complement_checksum function assumes that the bytes passed into
it are aligned on 16 bit boundaries.

When using gcc (GCC) 6.2.1 20160916 (Red Hat 6.2.1-2) with -O2, this
does not seem to hold true anymore; assuming 16 bit alignment will lead
to accesses to uninitialized memory and wrong checksums.

This commit adds a minimally invasive change that does not assume
alignment anymore. This might have a small performance impact for every
single packet we process.

This error occured reproducibly when called from icmp6_checksum.
  • Loading branch information
0xxon committed Oct 14, 2016
1 parent bd0a374 commit 24f74cb
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/net_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
// Returns the ones-complement checksum of a chunk of b short-aligned bytes.
int ones_complement_checksum(const void* p, int b, uint32 sum)
{
const u_short* sp = (u_short*) p; // better be aligned!
const unsigned char* sp = (unsigned char*) p;

b /= 2; // convert to count of short's

/* No need for endian conversions. */
while ( --b >= 0 )
sum += *sp++;
{
sum += *sp + ( *(sp+1) << 8 );
sp += 2;
}

while ( sum > 0xffff )
sum = (sum & 0xffff) + (sum >> 16);
Expand Down

0 comments on commit 24f74cb

Please sign in to comment.