VirtualBox

Changeset 27181 in vbox


Ignore:
Timestamp:
Mar 8, 2010 5:26:35 PM (15 years ago)
Author:
vboxsync
Message:

Storage/iSCSI: Increase sense data buffers, and truncate sense data if the buffers are too small. Also fixes a potential buffer overrun when collecting the sense data.

File:
1 edited

Legend:

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

    r26960 r27181  
    14261426    uint32_t *pDst = NULL;
    14271427    size_t cbBufLength;
    1428     uint32_t aStat[64];
     1428    uint32_t aStatus[256]; /**< Plenty of buffer for status information. */
    14291429    uint32_t ExpDataSN = 0;
    14301430    bool final = false;
     
    15251525        /* Always reserve space for the status - it's impossible to tell
    15261526         * beforehand whether this will be the final PDU or not. */
    1527         aISCSIRes[cnISCSIRes].pvSeg = aStat;
    1528         aISCSIRes[cnISCSIRes].cbSeg = sizeof(aStat);
     1527        aISCSIRes[cnISCSIRes].pvSeg = aStatus;
     1528        aISCSIRes[cnISCSIRes].cbSeg = sizeof(aStatus);
    15291529        cnISCSIRes++;
    15301530
     
    15551555            {
    15561556                uint32_t cbStat = RT_N2H_U32(((uint32_t *)aISCSIRes[1].pvSeg)[0]) >> 16;
    1557                 if (cbStat + 2 > cbData || cbStat > pRequest->cbSense)
     1557                if (cbStat + 2 > cbData)
    15581558                {
    15591559                    rc = VERR_BUFFER_OVERFLOW;
    15601560                    break;
    15611561                }
    1562                 pRequest->cbSense = cbStat;
    1563                 memcpy(pRequest->pvSense, ((const uint8_t *)aISCSIRes[1].pvSeg) + 2, aISCSIRes[1].cbSeg - 2);
    1564                 if (cnISCSIRes > 2 && aISCSIRes[2].cbSeg && (ssize_t)cbStat - aISCSIRes[1].cbSeg - 2 > 0)
    1565                     memcpy((char *)pRequest->pvSense + aISCSIRes[1].cbSeg, aISCSIRes[2].pvSeg, cbStat - aISCSIRes[1].cbSeg - 2);
     1562                /* Truncate sense data if it doesn't fit into the buffer. */
     1563                pRequest->cbSense = RT_MIN(cbStat, pRequest->cbSense);
     1564                memcpy(pRequest->pvSense,
     1565                       ((const char *)aISCSIRes[1].pvSeg) + 2,
     1566                       RT_MIN(aISCSIRes[1].cbSeg - 2, pRequest->cbSense));
     1567                if (   cnISCSIRes > 2 && aISCSIRes[2].cbSeg
     1568                    && (ssize_t)pRequest->cbSense - aISCSIRes[1].cbSeg + 2 > 0)
     1569                {
     1570                    memcpy((char *)pRequest->pvSense + aISCSIRes[1].cbSeg - 2,
     1571                           aISCSIRes[2].pvSeg,
     1572                           pRequest->cbSense - aISCSIRes[1].cbSeg + 2);
     1573                }
    15661574            }
    15671575            else if (cbData == 1)
     
    25382546
    25392547    SCSIREQ sr;
    2540     uint8_t sense[32];
     2548    uint8_t sense[96];
    25412549    uint8_t data8[8];
    25422550    uint8_t data12[12];
     
    30103018    SCSIREQ sr;
    30113019    uint8_t cdb[10];
    3012     uint8_t sense[32];
     3020    uint8_t sense[96];
    30133021
    30143022    cdb[0] = SCSI_READ_10;
     
    30913099    SCSIREQ sr;
    30923100    uint8_t cdb[10];
    3093     uint8_t sense[32];
     3101    uint8_t sense[96];
    30943102
    30953103    cdb[0] = SCSI_WRITE_10;
     
    31473155    SCSIREQ sr;
    31483156    uint8_t cdb[10];
    3149     uint8_t sense[32];
     3157    uint8_t sense[96];
    31503158
    31513159    cdb[0] = SCSI_SYNCHRONIZE_CACHE;
Note: See TracChangeset for help on using the changeset viewer.

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