| 1 | Index: linux/VBoxNetFlt-linux.c
|
|---|
| 2 | ===================================================================
|
|---|
| 3 | --- linux/VBoxNetFlt-linux.c (revision 61004)
|
|---|
| 4 | +++ linux/VBoxNetFlt-linux.c (revision 61005)
|
|---|
| 5 | @@ -527,7 +527,7 @@
|
|---|
| 6 | }
|
|---|
| 7 |
|
|---|
| 8 | /* WARNING! This function should only be called after vboxNetFltLinuxSkBufToSG()! */
|
|---|
| 9 | -static void vboxNetFltLinuxFreeSkBuff(struct sk_buff *pBuf, PINTNETSG pSG)
|
|---|
| 10 | +static void vboxNetFltLinuxDestroySG(struct sk_buff *pBuf, PINTNETSG pSG)
|
|---|
| 11 | {
|
|---|
| 12 | #ifdef VBOXNETFLT_SG_SUPPORT
|
|---|
| 13 | int i;
|
|---|
| 14 | @@ -538,8 +538,7 @@
|
|---|
| 15 | kunmap(pSG->aSegs[i+1].pv);
|
|---|
| 16 | }
|
|---|
| 17 | #endif
|
|---|
| 18 | -
|
|---|
| 19 | - dev_kfree_skb(pBuf);
|
|---|
| 20 | + NOREF(pSG);
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | #ifndef LOG_ENABLED
|
|---|
| 24 | @@ -572,26 +571,36 @@
|
|---|
| 25 |
|
|---|
| 26 | static int vboxNetFltLinuxForwardSegment(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, uint32_t fSrc)
|
|---|
| 27 | {
|
|---|
| 28 | + int rc;
|
|---|
| 29 | unsigned cSegs = vboxNetFltLinuxSGSegments(pThis, pBuf);
|
|---|
| 30 | if (cSegs < MAX_SKB_FRAGS)
|
|---|
| 31 | {
|
|---|
| 32 | - uint8_t *pTmp;
|
|---|
| 33 | PINTNETSG pSG = (PINTNETSG)alloca(RT_OFFSETOF(INTNETSG, aSegs[cSegs]));
|
|---|
| 34 | - if (!pSG)
|
|---|
| 35 | + if (RT_LIKELY(pSG))
|
|---|
| 36 | {
|
|---|
| 37 | + vboxNetFltLinuxSkBufToSG(pThis, pBuf, pSG, cSegs, fSrc);
|
|---|
| 38 | +
|
|---|
| 39 | + vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1);
|
|---|
| 40 | + pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, pSG, fSrc);
|
|---|
| 41 | +
|
|---|
| 42 | + vboxNetFltLinuxDestroySG(pBuf, pSG);
|
|---|
| 43 | + rc = VINF_SUCCESS;
|
|---|
| 44 | + }
|
|---|
| 45 | + else
|
|---|
| 46 | + {
|
|---|
| 47 | Log(("VBoxNetFlt: Failed to allocate SG buffer.\n"));
|
|---|
| 48 | - return VERR_NO_MEMORY;
|
|---|
| 49 | + rc = VERR_NO_MEMORY;
|
|---|
| 50 | }
|
|---|
| 51 | - vboxNetFltLinuxSkBufToSG(pThis, pBuf, pSG, cSegs, fSrc);
|
|---|
| 52 | -
|
|---|
| 53 | - pTmp = pSG->aSegs[0].pv;
|
|---|
| 54 | - vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1);
|
|---|
| 55 | - pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, pSG, fSrc);
|
|---|
| 56 | - Log4(("VBoxNetFlt: Dropping the sk_buff.\n"));
|
|---|
| 57 | - vboxNetFltLinuxFreeSkBuff(pBuf, pSG);
|
|---|
| 58 | }
|
|---|
| 59 | + else
|
|---|
| 60 | + {
|
|---|
| 61 | + Log(("VBoxNetFlt: Bad sk_buff? cSegs=%#x.\n", cSegs));
|
|---|
| 62 | + rc = VERR_INTERNAL_ERROR_3;
|
|---|
| 63 | + }
|
|---|
| 64 |
|
|---|
| 65 | - return VINF_SUCCESS;
|
|---|
| 66 | + Log4(("VBoxNetFlt: Dropping the sk_buff.\n"));
|
|---|
| 67 | + dev_kfree_skb(pBuf);
|
|---|
| 68 | + return rc;
|
|---|
| 69 | }
|
|---|
| 70 |
|
|---|
| 71 | static void vboxNetFltLinuxForwardToIntNet(PVBOXNETFLTINS pThis, struct sk_buff *pBuf)
|
|---|