Hello Sai!

I don't think we should print an error; this doesn't happen during normal usage.
Only happens if someone forges the STT segments and injects them into network
in order to crash our driver.

Thanks,
Paul

> -----Original Message-----
> From: Sairam Venugopal [mailto:vsai...@vmware.com]
> Sent: Thursday, June 2, 2016 4:16 AM
> To: Paul Boca; dev@openvswitch.org
> Subject: Re: [ovs-dev] [PATCH 3/4] datapath-windows: STT reassemble small fix
> 
> Thanks for fixing this. Should we log an error if we try to copy more than
> allocated packet length?
> 
> Acked-by: Sairam Venugopal <vsai...@vmware.com>
> 
> 
> On 5/17/16, 8:23 AM, "Paul Boca" <pb...@cloudbasesolutions.com> wrote:
> 
> >Fixed possible deadlock in case NdisGetDataBuffer fails
> >Validate the segment length and offset on reassemble to avoid buffer
> >overflow
> >
> >Signed-off-by: Paul-Daniel Boca <pb...@cloudbasesolutions.com>
> >---
> > datapath-windows/ovsext/Stt.c | 16 +++++++++++++---
> > datapath-windows/ovsext/Stt.h |  1 +
> > 2 files changed, 14 insertions(+), 3 deletions(-)
> >
> >diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c
> >index 5b5d950..8a1b1a9 100644
> >--- a/datapath-windows/ovsext/Stt.c
> >+++ b/datapath-windows/ovsext/Stt.c
> >@@ -607,9 +607,6 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT
> switchContext,
> >     SttHdr *sttHdr = NULL;
> >     sourceNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
> >
> >-    /* XXX optimize this lock */
> >-    NdisAcquireSpinLock(&OvsSttSpinLock);
> >-
> >     /* If this is the first fragment, copy the STT header */
> >     if (segOffset == 0) {
> >         sttHdr = NdisGetDataBuffer(sourceNb, sizeof(SttHdr), &stt, 1, 0);
> >@@ -621,6 +618,14 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT
> switchContext,
> >         startOffset = startOffset + STT_HDR_LEN;
> >     }
> >
> >+    if (offset + fragmentLength > innerPacketLen) {
> >+        // avoid buffer overflow on copy
> >+        return NULL;
> >+    }
> >+
> >+    /* XXX optimize this lock */
> >+    NdisAcquireSpinLock(&OvsSttSpinLock);
> >+
> >     /* Lookup fragment */
> >     OVS_STT_PKT_KEY pktKey = OvsGeneratePacketKey(ipHdr, tcp);
> >     UINT32 hash = OvsSttGetPktHash(&pktKey);
> >@@ -649,6 +654,7 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT
> switchContext,
> >         }
> >
> >         /* Copy the data from Source to new buffer */
> >+        entry->allocatedLen = innerPacketLen;
> >         entry->packetBuf = OvsAllocateMemoryWithTag(innerPacketLen,
> >                                                     OVS_STT_POOL_TAG);
> >         if (OvsGetPacketBytes(curNbl, fragmentLength, startOffset,
> >@@ -661,6 +667,10 @@ OvsSttReassemble(POVS_SWITCH_CONTEXT
> switchContext,
> >         InsertHeadList(&OvsSttPktFragHash[hash & STT_HASH_TABLE_MASK],
> >                        &entry->link);
> >     } else {
> >+        if (offset + fragmentLength > pktFragEntry->allocatedLen) {
> >+            // don't copy more than it is allocated
> >+            goto handle_error;
> >+        }
> >         /* Add to recieved length to identify if this is the last
> >fragment */
> >         pktFragEntry->recvdLen += fragmentLength;
> >         lastPacket = (pktFragEntry->recvdLen == innerPacketLen);
> >diff --git a/datapath-windows/ovsext/Stt.h b/datapath-windows/ovsext/Stt.h
> >index 20066e6..8aea164 100644
> >--- a/datapath-windows/ovsext/Stt.h
> >+++ b/datapath-windows/ovsext/Stt.h
> >@@ -67,6 +67,7 @@ typedef struct _OVS_STT_PKT_ENTRY {
> >     OVS_STT_PKT_KEY     ovsPktKey;
> >     UINT64              timeout;
> >     UINT32              recvdLen;
> >+    UINT32              allocatedLen;
> >     SttHdr              sttHdr;
> >     PCHAR               packetBuf;
> >     LIST_ENTRY          link;
> >--
> >2.7.2.windows.1
> >_______________________________________________
> >dev mailing list
> >dev@openvswitch.org
> >https://urldefense.proofpoint.com/v2/url?u=http-
> 3A__openvswitch.org_mailma
> >n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-
> uEs&r=Dc
> >ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=ks6H7c0dJA42Wc_Cm
> _8KRvAlNMZCZ1
> >q0OcbL35AInvU&s=rCUHnvtDWaBmIb-
> 8bKkBv6GpeDHX48S_WwQUS2yXLuc&e=

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to