提交 03247d43 编写于 作者: S Stefan Hajnoczi

rtl8139: check IP Header Length field (CVE-2015-5165)

The IP Header Length field was only checked in the IP checksum case, but
is used in other cases too.
Reported-by: N朱东海(启路) <donghai.zdh@alibaba-inc.com>
Reviewed-by: NJason Wang <jasowang@redhat.com>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 e1c120a9
...@@ -2186,6 +2186,10 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) ...@@ -2186,6 +2186,10 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s)
} }
hlen = IP_HEADER_LENGTH(ip); hlen = IP_HEADER_LENGTH(ip);
if (hlen < sizeof(ip_header) || hlen > eth_payload_len) {
goto skip_offload;
}
ip_protocol = ip->ip_p; ip_protocol = ip->ip_p;
ip_data_len = be16_to_cpu(ip->ip_len) - hlen; ip_data_len = be16_to_cpu(ip->ip_len) - hlen;
...@@ -2193,17 +2197,10 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s) ...@@ -2193,17 +2197,10 @@ static int rtl8139_cplus_transmit_one(RTL8139State *s)
{ {
DPRINTF("+++ C+ mode need IP checksum\n"); DPRINTF("+++ C+ mode need IP checksum\n");
if (hlen<sizeof(ip_header) || hlen>eth_payload_len) {/* min header length */ ip->ip_sum = 0;
/* bad packet header len */ ip->ip_sum = ip_checksum(ip, hlen);
/* or packet too short */ DPRINTF("+++ C+ mode IP header len=%d checksum=%04x\n",
} hlen, ip->ip_sum);
else
{
ip->ip_sum = 0;
ip->ip_sum = ip_checksum(ip, hlen);
DPRINTF("+++ C+ mode IP header len=%d checksum=%04x\n",
hlen, ip->ip_sum);
}
} }
if ((txdw0 & CP_TX_LGSEN) && ip_protocol == IP_PROTO_TCP) if ((txdw0 & CP_TX_LGSEN) && ip_protocol == IP_PROTO_TCP)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册