diff options
author | hselasky <hselasky@FreeBSD.org> | 2016-02-11 10:03:50 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2016-02-11 10:03:50 +0000 |
commit | 2593ff481eebffbf35ed6bd62410d267ff1baa11 (patch) | |
tree | 5611dbb9ab199ab53ced30bc304d878e2b76a30f /sys/netinet | |
parent | a33f5ef2d9ebef260c055337bf94134b2b5fd1e9 (diff) | |
download | FreeBSD-src-2593ff481eebffbf35ed6bd62410d267ff1baa11.zip FreeBSD-src-2593ff481eebffbf35ed6bd62410d267ff1baa11.tar.gz |
Use a pair of ifs when comparing the 32-bit flowid integers so that
the sign bit doesn't cause an overflow. The overflow manifests itself
as a sorting index wrap around in the middle of the sorted array,
which is not a problem for the LRO code, but might be a problem for
the logic inside qsort().
Reviewed by: gnn @
Sponsored by: Mellanox Technologies
Differential Revision: https://reviews.freebsd.org/D5239
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/tcp_lro.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c index d49071c..62d8595 100644 --- a/sys/netinet/tcp_lro.c +++ b/sys/netinet/tcp_lro.c @@ -347,9 +347,10 @@ tcp_lro_mbuf_compare_header(const void *ppa, const void *ppb) if (ret != 0) goto done; - ret = ma->m_pkthdr.flowid - mb->m_pkthdr.flowid; - if (ret != 0) - goto done; + if (ma->m_pkthdr.flowid > mb->m_pkthdr.flowid) + return (1); + else if (ma->m_pkthdr.flowid < mb->m_pkthdr.flowid) + return (-1); ret = TCP_LRO_SEQUENCE(ma) - TCP_LRO_SEQUENCE(mb); done: |