VirtualBox

Changeset 66521 in vbox


Ignore:
Timestamp:
Apr 12, 2017 8:33:38 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
114528
Message:

DevVirtioNet: bugref:8779: additional sanity check

File:
1 edited

Legend:

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

    r64390 r66521  
    11491149}
    11501150
    1151 DECLINLINE(void) vnetCompleteChecksum(uint8_t *pBuf, unsigned cbSize, uint16_t uStart, uint16_t uOffset)
     1151DECLINLINE(void) vnetCompleteChecksum(uint8_t *pBuf, size_t cbSize, uint16_t uStart, uint16_t uOffset)
    11521152{
    11531153    *(uint16_t*)(pBuf + uStart + uOffset) = vnetCSum16(pBuf + uStart, cbSize - uStart);
     
    12121212            STAM_PROFILE_ADV_START(&pThis->StatTransmit, a);
    12131213            /* Compute total frame size. */
    1214             for (unsigned int i = 1; i < elem.nOut; i++)
     1214            for (unsigned int i = 1; i < elem.nOut && uSize < VNET_MAX_FRAME_SIZE; i++)
    12151215                uSize += elem.aSegsOut[i].cb;
    12161216            Log5(("%s vnetTransmitPendingPackets: complete frame is %u bytes.\n", INSTANCE(pThis), uSize));
    12171217            Assert(uSize <= VNET_MAX_FRAME_SIZE);
     1218            /* Truncate oversized frames. */
     1219            if (uSize > VNET_MAX_FRAME_SIZE)
     1220                uSize = VNET_MAX_FRAME_SIZE;
    12181221            if (pThis->pDrv)
    12191222            {
     
    12351238                {
    12361239                    Assert(pSgBuf->cSegs == 1);
     1240                    pSgBuf->cbUsed = uSize;
    12371241                    /* Assemble a complete frame. */
    1238                     for (unsigned int i = 1; i < elem.nOut; i++)
     1242                    for (unsigned int i = 1; i < elem.nOut && uSize > 0; i++)
    12391243                    {
     1244                        unsigned int cbSegment = RT_MIN(uSize, elem.aSegsOut[i].cb);
    12401245                        PDMDevHlpPhysRead(pThis->VPCI.CTX_SUFF(pDevIns), elem.aSegsOut[i].addr,
    12411246                                          ((uint8_t*)pSgBuf->aSegs[0].pvSeg) + uOffset,
    1242                                           elem.aSegsOut[i].cb);
    1243                         uOffset += elem.aSegsOut[i].cb;
     1247                                          cbSegment);
     1248                        uOffset += cbSegment;
     1249                        uSize -= cbSegment;
    12441250                    }
    1245                     pSgBuf->cbUsed = uSize;
    1246                     vnetPacketDump(pThis, (uint8_t *)pSgBuf->aSegs[0].pvSeg, uSize, "--> Outgoing");
     1251                    vnetPacketDump(pThis, (uint8_t *)pSgBuf->aSegs[0].pvSeg, pSgBuf->cbUsed, "--> Outgoing");
    12471252                    if (pGso)
    12481253                    {
     
    12851290                         * This is not GSO frame but checksum offloading is requested.
    12861291                         */
    1287                         vnetCompleteChecksum((uint8_t*)pSgBuf->aSegs[0].pvSeg, uSize,
     1292                        vnetCompleteChecksum((uint8_t*)pSgBuf->aSegs[0].pvSeg, pSgBuf->cbUsed,
    12881293                                             Hdr.u16CSumStart, Hdr.u16CSumOffset);
    12891294                    }
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