VirtualBox

Changeset 88553 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Apr 15, 2021 5:12:28 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
143843
Message:

NAT: Do not attempt to segment frames with invalid GSO

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r85121 r88553  
    439439            uint8_t const  *pbFrame = (uint8_t const *)pSgBuf->aSegs[0].pvSeg;
    440440            PCPDMNETWORKGSO pGso    = (PCPDMNETWORKGSO)pSgBuf->pvUser;
    441             uint32_t const  cSegs   = PDMNetGsoCalcSegmentCount(pGso, pSgBuf->cbUsed);  Assert(cSegs > 1);
    442             for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
     441            /* Do not attempt to segment frames with invalid GSO parameters. */
     442            if (PDMNetGsoIsValid(pGso, sizeof(*pGso), pSgBuf->cbUsed))
    443443            {
    444                 size_t cbSeg;
    445                 void  *pvSeg;
    446                 m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrsTotal + pGso->cbMaxSeg, &pvSeg, &cbSeg);
    447                 if (!m)
    448                     break;
     444                uint32_t const  cSegs   = PDMNetGsoCalcSegmentCount(pGso, pSgBuf->cbUsed);  Assert(cSegs > 1);
     445                for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
     446                {
     447                    size_t cbSeg;
     448                    void  *pvSeg;
     449                    m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrsTotal + pGso->cbMaxSeg, &pvSeg, &cbSeg);
     450                    if (!m)
     451                        break;
    449452
    450453#if 1
    451                 uint32_t cbPayload, cbHdrs;
    452                 uint32_t offPayload = PDMNetGsoCarveSegment(pGso, pbFrame, pSgBuf->cbUsed,
    453                                                             iSeg, cSegs, (uint8_t *)pvSeg, &cbHdrs, &cbPayload);
    454                 memcpy((uint8_t *)pvSeg + cbHdrs, pbFrame + offPayload, cbPayload);
    455 
    456                 slirp_input(pThis->pNATState, m, cbPayload + cbHdrs);
     454                    uint32_t cbPayload, cbHdrs;
     455                    uint32_t offPayload = PDMNetGsoCarveSegment(pGso, pbFrame, pSgBuf->cbUsed,
     456                                                                iSeg, cSegs, (uint8_t *)pvSeg, &cbHdrs, &cbPayload);
     457                    memcpy((uint8_t *)pvSeg + cbHdrs, pbFrame + offPayload, cbPayload);
     458
     459                    slirp_input(pThis->pNATState, m, cbPayload + cbHdrs);
    457460#else
    458                 uint32_t cbSegFrame;
    459                 void *pvSegFrame = PDMNetGsoCarveSegmentQD(pGso, (uint8_t *)pbFrame, pSgBuf->cbUsed, abHdrScratch,
    460                                                            iSeg, cSegs, &cbSegFrame);
    461                 memcpy((uint8_t *)pvSeg, pvSegFrame, cbSegFrame);
    462 
    463                 slirp_input(pThis->pNATState, m, cbSegFrame);
    464 #endif
     461                    uint32_t cbSegFrame;
     462                    void *pvSegFrame = PDMNetGsoCarveSegmentQD(pGso, (uint8_t *)pbFrame, pSgBuf->cbUsed, abHdrScratch,
     463                                                            iSeg, cSegs, &cbSegFrame);
     464                    memcpy((uint8_t *)pvSeg, pvSegFrame, cbSegFrame);
     465
     466                    slirp_input(pThis->pNATState, m, cbSegFrame);
     467#endif
     468                }
    465469            }
    466470        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette