aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/net.h2
-rw-r--r--net/net.c3
2 files changed, 5 insertions, 0 deletions
diff --git a/include/net.h b/include/net.h
index 675bf41..e3889a0 100644
--- a/include/net.h
+++ b/include/net.h
@@ -391,6 +391,8 @@ struct ip_hdr {
#define IP_HDR_SIZE (sizeof(struct ip_hdr))
+#define IP_MIN_FRAG_DATAGRAM_SIZE (IP_HDR_SIZE + 8)
+
/*
* Internet Protocol (IP) + UDP header.
*/
diff --git a/net/net.c b/net/net.c
index 034a5d6..81905f6 100644
--- a/net/net.c
+++ b/net/net.c
@@ -907,6 +907,9 @@ static struct ip_udp_hdr *__net_defragment(struct ip_udp_hdr *ip, int *lenp)
int offset8, start, len, done = 0;
u16 ip_off = ntohs(ip->ip_off);
+ if (ip->ip_len < IP_MIN_FRAG_DATAGRAM_SIZE)
+ return NULL;
+
/* payload starts after IP header, this fragment is in there */
payload = (struct hole *)(pkt_buff + IP_HDR_SIZE);
offset8 = (ip_off & IP_OFFS);