@@ -2414,6 +2414,13 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
}
PNET_BUFFER_LIST oldNbl = ovsFwdCtx.curNbl;
+ PUINT8 bufferStart = NULL;
+
+ bufferStart = OvsGetHeaderBySize(&ovsFwdCtx, layers->l7Offset);
+ if (!bufferStart) {
+ dropReason = L"OVS-Netbuf reallocated failed";
+ goto dropit;
+ }
status = OvsExecuteConntrackAction(&ovsFwdCtx, key,
(const PNL_ATTR)a);
if (status != NDIS_STATUS_SUCCESS) {
@@ -1110,12 +1110,14 @@ GetIpHeaderInfo(PNET_BUFFER_LIST curNbl,
IPHdr *ipHdr;
IPv6Hdr *ipv6Hdr;
PNET_BUFFER curNb;
+ CHAR tempBuf[MAX_IP_HEADER_LEN];
curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
ASSERT(NET_BUFFER_NEXT_NB(curNb) == NULL);
+ NdisZeroMemory(tempBuf, MAX_IP_HEADER_LEN);
eth = (EthHdr *)NdisGetDataBuffer(curNb,
hdrInfo->l4Offset,
- NULL, 1, 0);
+ (PVOID)tempBuf, 1, 0);
if (eth == NULL) {
return NDIS_STATUS_INVALID_PACKET;
}
@@ -683,6 +683,7 @@ OvsGetTcpHeader(PNET_BUFFER_LIST nbl,
TCPHdr *tcp;
VOID *dest = storage;
uint16_t ipv6ExtLength = 0;
+ CHAR tempBuf[MAX_IP_HEADER_LEN];
if (layers->isIPv6) {
ipv6Hdr = NdisGetDataBuffer(NET_BUFFER_LIST_FIRST_NB(nbl),
@@ -701,9 +702,10 @@ OvsGetTcpHeader(PNET_BUFFER_LIST nbl,
return storage;
}
} else {
+ NdisZeroMemory(tempBuf, MAX_IP_HEADER_LEN);
ipHdr = NdisGetDataBuffer(NET_BUFFER_LIST_FIRST_NB(nbl),
layers->l4Offset + sizeof(TCPHdr),
- NULL, 1 /*no align*/, 0);
+ (PVOID)tempBuf, 1 /*no align*/, 0);
if (ipHdr == NULL) {
return NULL;
}
@@ -1202,6 +1204,8 @@ OvsCtExecute_(OvsForwardingContext *fwdCtx,
UINT64 currentTime;
NdisGetCurrentSystemTime((LARGE_INTEGER *) ¤tTime);
+
+ curNbl = fwdCtx->curNbl;
/* Retrieve the Conntrack Key related fields from packet */
OvsCtSetupLookupCtx(key, zone, &ctx, curNbl, layers->l4Offset);
@@ -153,12 +153,14 @@ OvsIpv4Reassemble(POVS_SWITCH_CONTEXT switchContext,
PNET_BUFFER_LIST newNbl = NULL;
UINT16 ipHdrLen, packetHeader;
UINT32 packetLen;
+ CHAR tempBuf[MAX_IP_HEADER_LEN];
curNb = NET_BUFFER_LIST_FIRST_NB(*curNbl);
ASSERT(NET_BUFFER_NEXT_NB(curNb) == NULL);
+ NdisZeroMemory(tempBuf, MAX_IP_HEADER_LEN);
eth = (EthHdr*)NdisGetDataBuffer(curNb, layers->l4Offset,
- NULL, 1, 0);
+ (PVOID)tempBuf, 1, 0);
if (eth == NULL) {
return NDIS_STATUS_INVALID_PACKET;
}
@@ -253,12 +255,14 @@ OvsProcessIpv4Fragment(POVS_SWITCH_CONTEXT switchContext,
POVS_IPFRAG_ENTRY entry;
POVS_FRAGMENT_LIST fragStorage;
LOCK_STATE_EX htLockState;
+ CHAR tempBuf[MAX_IP_HEADER_LEN];
curNb = NET_BUFFER_LIST_FIRST_NB(*curNbl);
ASSERT(NET_BUFFER_NEXT_NB(curNb) == NULL);
+ NdisZeroMemory(tempBuf, MAX_IP_HEADER_LEN);
eth = (EthHdr*)NdisGetDataBuffer(curNb, layers->l4Offset,
- NULL, 1, 0);
+ (PVOID)tempBuf, 1, 0);
if (eth == NULL) {
return NDIS_STATUS_INVALID_PACKET;
}
@@ -18,6 +18,7 @@
#define __PACKET_PARSER_H_ 1
#define MIN_IPV4_HLEN 20
+#define MAX_IP_HEADER_LEN 80
#include "precomp.h"
#include "NetProto.h"