summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2016-02-11 10:03:50 +0000
committerhselasky <hselasky@FreeBSD.org>2016-02-11 10:03:50 +0000
commit2593ff481eebffbf35ed6bd62410d267ff1baa11 (patch)
tree5611dbb9ab199ab53ced30bc304d878e2b76a30f /sys/netinet
parenta33f5ef2d9ebef260c055337bf94134b2b5fd1e9 (diff)
downloadFreeBSD-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.c7
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:
OpenPOWER on IntegriCloud