mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 20:44:39 +08:00
net/udp: Validate UDP length field against actual packet size
According to RFC768 page 2, length feild is the length in octets of this user datagram including this header and the data. Signed-off-by: gaohedong <gaohedong@xiaomi.com>
This commit is contained in:
@@ -215,6 +215,7 @@ static int udp_input(FAR struct net_driver_s *dev, unsigned int iplen)
|
||||
FAR struct iob_s *iob;
|
||||
#endif
|
||||
unsigned int udpiplen;
|
||||
unsigned int udpdatalen = dev->d_len - iplen;
|
||||
#ifdef CONFIG_NET_UDP_CHECKSUMS
|
||||
uint16_t chksum;
|
||||
#endif
|
||||
@@ -232,6 +233,16 @@ static int udp_input(FAR struct net_driver_s *dev, unsigned int iplen)
|
||||
|
||||
udp = IPBUF(iplen);
|
||||
|
||||
/* Check the UDP packet length */
|
||||
|
||||
if (udpdatalen < UDP_HDRLEN || ntohs(udp->udplen) != udpdatalen)
|
||||
{
|
||||
nwarn("WARNING: UDP length invalid: hdr=%u actual=%u\n",
|
||||
ntohs(udp->udplen), udpdatalen);
|
||||
dev->d_len = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Get the size of the IP header and the UDP header */
|
||||
|
||||
udpiplen = iplen + UDP_HDRLEN;
|
||||
|
||||
Reference in New Issue
Block a user