VirtualBox

Ticket #5260: diff_vboxnetflt_linux

File diff_vboxnetflt_linux, 2.2 KB (added by Frank Mehnert, 14 years ago)

Patch for /usr/src/vboxnetflt-/

Line 
1Index: 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)

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy