}
}
}
+ } else {
+ /* Invalid network header */
+ return NDIS_STATUS_INVALID_PACKET;
}
} else if (dlType == htons(ETH_TYPE_IPV6)) {
NDIS_STATUS status;
}
}
} else {
+ /* Invalid network header */
((UINT64 *)ipKey)[0] = 0;
((UINT64 *)ipKey)[1] = 0;
+ return NDIS_STATUS_INVALID_PACKET;
}
} else if (flow->l2.dlType == htons(ETH_TYPE_IPV6)) {
NDIS_STATUS status;
if (checksum != hdrChecksum) {
return NDIS_STATUS_FAILURE;
}
+ } else {
+ /* Invalid network header */
+ return NDIS_STATUS_FAILURE;
}
}
return NDIS_STATUS_SUCCESS;
#ifndef __PACKET_PARSER_H_
#define __PACKET_PARSER_H_ 1
+#define MIN_IPV4_HLEN 20
+
#include "precomp.h"
#include "NetProto.h"
const IPHdr *ip = OvsGetPacketBytes(packet, sizeof *ip, ofs, storage);
if (ip) {
int ipLen = ip->ihl * 4;
- if (ipLen >= sizeof *ip && OvsPacketLenNBL(packet) >= ofs + ipLen) {
+ if (ipLen < MIN_IPV4_HLEN ||
+ ipLen > MAX_IPV4_HLEN ||
+ OvsPacketLenNBL(packet) < ofs + ipLen) {
+ /* IP header is invalid, flag it */
+ return NULL;
+ } else {
return ip;
}
}
innerIpHdr->check = IPChecksum((UINT8 *)innerIpHdr,
innerIpHdr->ihl * 4, 0);
} else {
- status = NDIS_STATUS_RESOURCES;
+ status = NDIS_STATUS_INVALID_PACKET;
goto dropNbl;
}
} else if (layers.isIPv6) {
ndisStatus = OvsExtractFlow(pNbl, execute->inPort, &key, &layers,
tempTunKey.tunKey.dst == 0 ? NULL : &tempTunKey.tunKey);
+ if (ndisStatus != NDIS_STATUS_SUCCESS) {
+ /* Invalid network header */
+ goto dropit;
+ }
+
ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(pNbl);
ctx->mru = execute->mru;
if (nh) {
layers.l4Offset = layers.l3Offset + nh->ihl * 4;
} else {
- break;
+ status = NDIS_STATUS_INVALID_PACKET;
+ break;
}
/* make sure it's a VXLAN packet */