Skip to content

Commit 723416f

Browse files
Joseph Hindinvrozenfe
Joseph Hindin
authored andcommitted
NetKVM: BZ#1169718: Checking the length only on read
Signed-off-by: Joseph Hindin <yhindin@rehat.com>
1 parent 59cb10c commit 723416f

File tree

5 files changed

+24
-16
lines changed

5 files changed

+24
-16
lines changed

Diff for: NetKVM/Common/ParaNdis-Common.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -2219,7 +2219,8 @@ tChecksumCheckResult ParaNdis_CheckRxChecksum(
22192219
ULONG virtioFlags,
22202220
tCompletePhysicalAddress *pPacketPages,
22212221
ULONG ulPacketLength,
2222-
ULONG ulDataOffset)
2222+
ULONG ulDataOffset,
2223+
BOOLEAN verifyLength)
22232224
{
22242225
tOffloadSettingsFlags f = pContext->Offload.flags;
22252226
tChecksumCheckResult res;
@@ -2247,7 +2248,8 @@ tChecksumCheckResult ParaNdis_CheckRxChecksum(
22472248
}
22482249
}
22492250

2250-
ppr = ParaNdis_CheckSumVerify(pPacketPages, ulPacketLength - ETH_HEADER_SIZE, ulDataOffset + ETH_HEADER_SIZE, flagsToCalculate, __FUNCTION__);
2251+
ppr = ParaNdis_CheckSumVerify(pPacketPages, ulPacketLength - ETH_HEADER_SIZE, ulDataOffset + ETH_HEADER_SIZE, flagsToCalculate,
2252+
verifyLength, __FUNCTION__);
22512253

22522254
if (ppr.ipCheckSum == ppresIPTooShort || ppr.xxpStatus == ppresXxpIncomplete)
22532255
{

Diff for: NetKVM/Common/ParaNdis-TX.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,7 @@ void CNB::SetupLSO(virtio_net_hdr_basic *VirtioHeader, PVOID IpHeader, ULONG Eth
649649
tTcpIpPacketParsingResult packetReview;
650650
packetReview = ParaNdis_CheckSumVerifyFlat(reinterpret_cast<IPv4Header*>(IpHeader), EthPayloadLength,
651651
pcrIpChecksum | pcrFixIPChecksum | pcrTcpChecksum | pcrFixPHChecksum,
652+
FALSE,
652653
__FUNCTION__);
653654

654655
if (packetReview.xxpCheckSum == ppresPCSOK || packetReview.fixedXxpCS)
@@ -670,7 +671,7 @@ USHORT CNB::QueryL4HeaderOffset(PVOID PacketData, ULONG IpHeaderOffset) const
670671
{
671672
USHORT Res;
672673
auto ppr = ParaNdis_ReviewIPPacket(RtlOffsetToPointer(PacketData, IpHeaderOffset),
673-
GetDataLength(), __FUNCTION__);
674+
GetDataLength(), FALSE, __FUNCTION__);
674675
if (ppr.ipStatus != ppresNotIP)
675676
{
676677
Res = static_cast<USHORT>(IpHeaderOffset + ppr.ipHeaderSize);
@@ -696,7 +697,7 @@ void CNB::DoIPHdrCSO(PVOID IpHeader, ULONG EthPayloadLength) const
696697
{
697698
ParaNdis_CheckSumVerifyFlat(IpHeader,
698699
EthPayloadLength,
699-
pcrIpChecksum | pcrFixIPChecksum,
700+
pcrIpChecksum | pcrFixIPChecksum, FALSE,
700701
__FUNCTION__);
701702
}
702703

Diff for: NetKVM/Common/ndis56common.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,8 @@ tChecksumCheckResult ParaNdis_CheckRxChecksum(
744744
ULONG virtioFlags,
745745
tCompletePhysicalAddress *pPacketPages,
746746
ULONG ulPacketLength,
747-
ULONG ulDataOffset);
747+
ULONG ulDataOffset,
748+
BOOLEAN verifyLength);
748749

749750
void ParaNdis_CallOnBugCheck(PARANDIS_ADAPTER *pContext);
750751

@@ -917,22 +918,24 @@ tTcpIpPacketParsingResult ParaNdis_CheckSumVerify(
917918
ULONG ulDataLength,
918919
ULONG ulStartOffset,
919920
ULONG flags,
921+
BOOLEAN verifyLength,
920922
LPCSTR caller);
921923

922924
static __inline
923925
tTcpIpPacketParsingResult ParaNdis_CheckSumVerifyFlat(
924926
PVOID pBuffer,
925927
ULONG ulDataLength,
926928
ULONG flags,
929+
BOOLEAN verifyLength,
927930
LPCSTR caller)
928931
{
929932
tCompletePhysicalAddress SGBuffer;
930933
SGBuffer.Virtual = pBuffer;
931934
SGBuffer.size = ulDataLength;
932-
return ParaNdis_CheckSumVerify(&SGBuffer, ulDataLength, 0, flags, caller);
935+
return ParaNdis_CheckSumVerify(&SGBuffer, ulDataLength, 0, flags, verifyLength, caller);
933936
}
934937

935-
tTcpIpPacketParsingResult ParaNdis_ReviewIPPacket(PVOID buffer, ULONG size, LPCSTR caller);
938+
tTcpIpPacketParsingResult ParaNdis_ReviewIPPacket(PVOID buffer, ULONG size, BOOLEAN verityLength, LPCSTR caller);
936939

937940
BOOLEAN ParaNdis_AnalyzeReceivedPacket(PVOID headersBuffer, ULONG dataLength, PNET_PACKET_INFO packetInfo);
938941
ULONG ParaNdis_StripVlanHeaderMoveHead(PNET_PACKET_INFO packetInfo);

Diff for: NetKVM/Common/sw-offload.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ ProcessUDPHeader(tTcpIpPacketParsingResult _res, PVOID pIpHeader, ULONG len, USH
200200
}
201201

202202
static __inline tTcpIpPacketParsingResult
203-
QualifyIpPacket(IPHeader *pIpHeader, ULONG len)
203+
QualifyIpPacket(IPHeader *pIpHeader, ULONG len, BOOLEAN verifyLength)
204204
{
205205
tTcpIpPacketParsingResult res;
206206
res.value = 0;
@@ -235,10 +235,10 @@ QualifyIpPacket(IPHeader *pIpHeader, ULONG len)
235235
return res;
236236
}
237237

238-
if (ipHeaderSize >= fullLength || len < fullLength)
238+
if (ipHeaderSize >= fullLength || ( verifyLength && len < fullLength))
239239
{
240-
DPrintf(2, ("[%s] - truncated packet - ip_version %d, ipHeaderSize %d, protocol %d, iplen %d, L2 payload length %d\n", __FUNCTION__,
241-
ip_version, ipHeaderSize, pIpHeader->v4.ip_protocol, fullLength, len));
240+
DPrintf(2, ("[%s] - truncated packet - ip_version %d, ipHeaderSize %d, protocol %d, iplen %d, L2 payload length %d, verify = %s\n", __FUNCTION__,
241+
ip_version, ipHeaderSize, pIpHeader->v4.ip_protocol, fullLength, len, (verifyLength ? "true" : "false")));
242242
res.ipCheckSum = ppresIPTooShort;
243243
return res;
244244
}
@@ -258,7 +258,8 @@ QualifyIpPacket(IPHeader *pIpHeader, ULONG len)
258258
res.ipCheckSum = ppresCSOK;
259259
fullLength = swap_short(pIpHeader->v6.ip6_payload_len);
260260
fullLength += ipHeaderSize;
261-
if (len < fullLength)
261+
262+
if (verifyLength && (len < fullLength))
262263
{
263264
res.ipStatus = ppresNotIP;
264265
return res;
@@ -648,11 +649,12 @@ tTcpIpPacketParsingResult ParaNdis_CheckSumVerify(
648649
ULONG ulDataLength,
649650
ULONG ulStartOffset,
650651
ULONG flags,
652+
BOOLEAN verifyLength,
651653
LPCSTR caller)
652654
{
653655
IPHeader *pIpHeader = (IPHeader *) RtlOffsetToPointer(pDataPages[0].Virtual, ulStartOffset);
654656

655-
tTcpIpPacketParsingResult res = QualifyIpPacket(pIpHeader, ulDataLength);
657+
tTcpIpPacketParsingResult res = QualifyIpPacket(pIpHeader, ulDataLength, verifyLength);
656658
if (res.ipStatus == ppresNotIP || res.ipCheckSum == ppresIPTooShort)
657659
return res;
658660

@@ -702,9 +704,9 @@ tTcpIpPacketParsingResult ParaNdis_CheckSumVerify(
702704
return res;
703705
}
704706

705-
tTcpIpPacketParsingResult ParaNdis_ReviewIPPacket(PVOID buffer, ULONG size, LPCSTR caller)
707+
tTcpIpPacketParsingResult ParaNdis_ReviewIPPacket(PVOID buffer, ULONG size, BOOLEAN verifyLength, LPCSTR caller)
706708
{
707-
tTcpIpPacketParsingResult res = QualifyIpPacket((IPHeader *) buffer, size);
709+
tTcpIpPacketParsingResult res = QualifyIpPacket((IPHeader *) buffer, size, verifyLength);
708710
PrintOutParsingResult(res, 1, caller);
709711
return res;
710712
}

Diff for: NetKVM/wlh/ParaNdis6-Impl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -866,7 +866,7 @@ tPacketIndicationType ParaNdis_PrepareReceivedPacket(
866866
pHeader->flags,
867867
&pBuffersDesc->PhysicalPages[PARANDIS_FIRST_RX_DATA_PAGE],
868868
pPacketInfo->dataLength,
869-
nBytesStripped);
869+
nBytesStripped, TRUE);
870870
if (csRes.value)
871871
{
872872
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO qCSInfo;

0 commit comments

Comments
 (0)