Fix bug #54506 (LWIP_CHECKSUM_ON_COPY causes wrong checksum (0xFFFF))

one's complement sum was not correctly done, which could result in the
checksum being 0xFFFF instead of 0 in some cases.
This commit is contained in:
Simon Goldschmidt 2018-09-12 21:56:16 +02:00
parent cdfa3dfa9d
commit bc48eb512e

View File

@ -1585,8 +1585,8 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif
seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum); seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);
seg->chksum_swapped = 0; seg->chksum_swapped = 0;
} }
acc += (u16_t)~(seg->chksum); acc = (u16_t)~acc + seg->chksum;
seg->tcphdr->chksum = FOLD_U32T(acc); seg->tcphdr->chksum = (u16_t)~FOLD_U32T(acc);
#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK #if TCP_CHECKSUM_ON_COPY_SANITY_CHECK
if (chksum_slow != seg->tcphdr->chksum) { if (chksum_slow != seg->tcphdr->chksum) {
TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL( TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(