From: Stefan Hajnoczi Date: Wed, 15 Jul 2015 16:36:15 +0000 (+0100) Subject: rtl8139: skip offload on short TCP header (CVE-2015-5165) X-Git-Tag: v2.3.1~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f4c861fd68838649e81e0f9a6d75b154fda76440;p=thirdparty%2Fqemu.git rtl8139: skip offload on short TCP header (CVE-2015-5165) TCP Large Segment Offload accesses the TCP header in the packet. If the packet is too short we must not attempt to access header fields: tcp_header *p_tcp_hdr = (tcp_header*)(eth_payload_data + hlen); int tcp_hlen = TCP_HEADER_DATA_OFFSET(p_tcp_hdr); Reported-by: 朱东海(启路) Reviewed-by: Jason Wang Signed-off-by: Stefan Hajnoczi (cherry picked from commit 4240be45632db7831129f124bcf53c1223825b0f) Signed-off-by: Michael Roth --- diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c index c88bf9b3115..efde7b441fe 100644 --- a/hw/net/rtl8139.c +++ b/hw/net/rtl8139.c @@ -2210,6 +2210,11 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) if ((txdw0 & CP_TX_LGSEN) && ip_protocol == IP_PROTO_TCP) { + /* Large enough for the TCP header? */ + if (ip_data_len < sizeof(tcp_header)) { + goto skip_offload; + } + int large_send_mss = (txdw0 >> 16) & CP_TC_LGSEN_MSS_MASK; DPRINTF("+++ C+ mode offloaded task TSO MTU=%d IP data %d "