VirtualBox

Changeset 87164 in vbox


Ignore:
Timestamp:
Jan 4, 2021 1:19:24 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142084
Message:

Devices/DevLsiLogicSCSI: Stricter range check, bugref:9897

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp

    r87112 r87164  
    11181118            pReply->IOCFacts.u8MaxBuses           = pThis->cMaxBuses;
    11191119
    1120             /* Check for a valid firmware image in the IOC memory which was downlaoded by tzhe guest earlier. */
     1120            pReply->IOCFacts.u16ProductID         = 0xcafe; /* Our own product ID :) */
     1121            pReply->IOCFacts.u32FwImageSize       = 0; /* No image needed. */
     1122            pReply->IOCFacts.u32FWVersion         = 0;
     1123
     1124            /* Check for a valid firmware image in the IOC memory which was downloaded by the guest earlier and use that. */
    11211125            PLSILOGICMEMREGN pRegion = lsilogicR3MemRegionFindByAddr(pThisCC, LSILOGIC_FWIMGHDR_LOAD_ADDRESS);
    1122 
    11231126            if (pRegion)
    11241127            {
    1125                 uint32_t offImgHdr = (LSILOGIC_FWIMGHDR_LOAD_ADDRESS - pRegion->u32AddrStart) / 4;
    1126                 PFwImageHdr pFwImgHdr = (PFwImageHdr)&pRegion->au32Data[offImgHdr];
    1127 
    1128                 /* Check for the signature. */
    1129                 /** @todo Checksum validation. */
    1130                 if (   pFwImgHdr->u32Signature1 == LSILOGIC_FWIMGHDR_SIGNATURE1
    1131                     && pFwImgHdr->u32Signature2 == LSILOGIC_FWIMGHDR_SIGNATURE2
    1132                     && pFwImgHdr->u32Signature3 == LSILOGIC_FWIMGHDR_SIGNATURE3)
     1128                uint32_t offImgHdr = (LSILOGIC_FWIMGHDR_LOAD_ADDRESS - pRegion->u32AddrStart);
     1129                if (pRegion->u32AddrEnd - offImgHdr + 1 >= sizeof(FwImageHdr)) /* End address is inclusive. */
    11331130                {
    1134                     LogFlowFunc(("IOC Facts: Found valid firmware image header in memory, using version (%#x), size (%d) and product ID (%#x) from there\n",
    1135                                  pFwImgHdr->u32FwVersion, pFwImgHdr->u32ImageSize, pFwImgHdr->u16ProductId));
    1136 
    1137                     pReply->IOCFacts.u16ProductID         = pFwImgHdr->u16ProductId;
    1138                     pReply->IOCFacts.u32FwImageSize       = pFwImgHdr->u32ImageSize;
    1139                     pReply->IOCFacts.u32FWVersion         = pFwImgHdr->u32FwVersion;
     1131                    PFwImageHdr pFwImgHdr = (PFwImageHdr)&pRegion->au32Data[offImgHdr / 4];
     1132
     1133                    /* Check for the signature. */
     1134                    /** @todo Checksum validation. */
     1135                    if (   pFwImgHdr->u32Signature1 == LSILOGIC_FWIMGHDR_SIGNATURE1
     1136                        && pFwImgHdr->u32Signature2 == LSILOGIC_FWIMGHDR_SIGNATURE2
     1137                        && pFwImgHdr->u32Signature3 == LSILOGIC_FWIMGHDR_SIGNATURE3)
     1138                    {
     1139                        LogFlowFunc(("IOC Facts: Found valid firmware image header in memory, using version (%#x), size (%d) and product ID (%#x) from there\n",
     1140                                     pFwImgHdr->u32FwVersion, pFwImgHdr->u32ImageSize, pFwImgHdr->u16ProductId));
     1141
     1142                        pReply->IOCFacts.u16ProductID         = pFwImgHdr->u16ProductId;
     1143                        pReply->IOCFacts.u32FwImageSize       = pFwImgHdr->u32ImageSize;
     1144                        pReply->IOCFacts.u32FWVersion         = pFwImgHdr->u32FwVersion;
     1145                    }
    11401146                }
    1141             }
    1142             else
    1143             {
    1144                 pReply->IOCFacts.u16ProductID         = 0xcafe; /* Our own product ID :) */
    1145                 pReply->IOCFacts.u32FwImageSize       = 0; /* No image needed. */
    1146                 pReply->IOCFacts.u32FWVersion         = 0;
    11471147            }
    11481148            break;
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