VirtualBox

Changeset 81859 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 15, 2019 12:32:18 AM (5 years ago)
Author:
vboxsync
Message:

DevATA: Make sure to use a valid index into the function tables. bugref:9218

File:
1 edited

Legend:

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

    r81858 r81859  
    676676
    677677# ifdef IN_RING3
    678 typedef void (*PBeginTransferFunc)(ATADevState *);
    679 typedef bool (*PSourceSinkFunc)(ATADevState *);
     678typedef void (*PFNBEGINTRANSFER)(ATADevState *);
     679typedef bool (*PFNSOURCESINK)(ATADevState *);
    680680
    681681static void ataR3ReadWriteSectorsBT(ATADevState *);
     
    730730 * Make sure ATAFNET and this array match!
    731731 */
    732 static const PBeginTransferFunc g_apfnBeginTransFuncs[ATAFN_BT_MAX] =
     732static const PFNBEGINTRANSFER g_apfnBeginTransFuncs[ATAFN_BT_MAX] =
    733733{
    734734    NULL,
     
    780780 * Make sure ATAFNSS and this array match!
    781781 */
    782 static const PSourceSinkFunc g_apfnSourceSinkFuncs[ATAFN_SS_MAX] =
     782static const PFNSOURCESINK g_apfnSourceSinkFuncs[ATAFN_SS_MAX] =
    783783{
    784784    NULL,
     
    48234823         * very similarly by not continuing with the current instruction
    48244824         * until the transfer to/from the storage medium is completed. */
    4825         if (s->iSourceSink != ATAFN_SS_NULL)
     4825        uint8_t const iSourceSink = s->iSourceSink;
     4826        if (   iSourceSink != ATAFN_SS_NULL
     4827            && iSourceSink < RT_ELEMENTS(g_apfnSourceSinkFuncs))
    48264828        {
    48274829            bool fRedo;
     
    48294831            ataSetStatusValue(s, ATA_STAT_BUSY);
    48304832            Log2(("%s: calling source/sink function\n", __FUNCTION__));
    4831             fRedo = g_apfnSourceSinkFuncs[s->iSourceSink](s);
     4833            fRedo = g_apfnSourceSinkFuncs[iSourceSink](s);
    48324834            pCtl->fRedo = fRedo;
    48334835            if (RT_UNLIKELY(fRedo))
     
    48374839            s->iIOBufferEnd = s->cbElementaryTransfer;
    48384840        }
     4841        else
     4842            Assert(iSourceSink == ATAFN_SS_NULL);
    48394843# else
    48404844        AssertReleaseFailed();
     
    54415445                 * the guest can continue in parallel). If so, the state
    54425446                 * is already set up so the loop is exited immediately. */
    5443                 if (s->iSourceSink != ATAFN_SS_NULL)
     5447                uint8_t const iSourceSink = s->iSourceSink;
     5448                if (   iSourceSink != ATAFN_SS_NULL
     5449                    && iSourceSink < RT_ELEMENTS(g_apfnSourceSinkFuncs))
    54445450                {
    54455451                    s->iIOBufferCur = iIOBufferCur;
     
    54485454                    s->cbTotalTransfer = cbTotalTransfer;
    54495455                    Log2(("%s: calling source/sink function\n", __FUNCTION__));
    5450                     fRedo = g_apfnSourceSinkFuncs[s->iSourceSink](s);
     5456                    fRedo = g_apfnSourceSinkFuncs[iSourceSink](s);
    54515457                    if (RT_UNLIKELY(fRedo))
    54525458                    {
     
    54715477                {
    54725478                    /* This forces the loop to exit immediately. */
     5479                    Assert(iSourceSink == ATAFN_SS_NULL);
    54735480                    GCPhysDesc = pCtl->GCPhysLastDMADesc + 1;
    54745481                }
     
    56365643        {
    56375644            case ATA_AIO_NEW:
    5638 
     5645            {
    56395646                pCtl->iAIOIf = pReq->u.t.iIf;
    56405647                s = &pCtl->aIfs[pCtl->iAIOIf & ATA_SELECTED_IF_MASK];
     
    56685675                pCtl->fChainedTransfer = false;
    56695676
    5670                 if (s->iBeginTransfer != ATAFN_BT_NULL)
     5677                uint8_t const iBeginTransfer = s->iBeginTransfer;
     5678                if (   iBeginTransfer != ATAFN_BT_NULL
     5679                    && iBeginTransfer < RT_ELEMENTS(g_apfnBeginTransFuncs))
    56715680                {
    56725681                    Log2(("%s: Ctl#%d: calling begin transfer function\n", __FUNCTION__, ATACONTROLLER_IDX(pCtl)));
    5673                     g_apfnBeginTransFuncs[s->iBeginTransfer](s);
     5682                    g_apfnBeginTransFuncs[iBeginTransfer](s);
    56745683                    s->iBeginTransfer = ATAFN_BT_NULL;
    56755684                    if (s->uTxDir != PDMMEDIATXDIR_FROM_DEVICE)
     
    56785687                else
    56795688                {
     5689                    Assert(iBeginTransfer == ATAFN_BT_NULL);
    56805690                    s->cbElementaryTransfer = s->cbTotalTransfer;
    56815691                    s->iIOBufferEnd = s->cbTotalTransfer;
     
    56855695                if (s->uTxDir != PDMMEDIATXDIR_TO_DEVICE)
    56865696                {
    5687                     if (s->iSourceSink != ATAFN_SS_NULL)
     5697                    uint8_t const iSourceSink = s->iSourceSink;
     5698                    if (   iSourceSink != ATAFN_SS_NULL
     5699                        && iSourceSink < RT_ELEMENTS(g_apfnSourceSinkFuncs))
    56885700                    {
    56895701                        bool fRedo;
    56905702                        Log2(("%s: Ctl#%d: calling source/sink function\n", __FUNCTION__, ATACONTROLLER_IDX(pCtl)));
    5691                         fRedo = g_apfnSourceSinkFuncs[s->iSourceSink](s);
     5703                        fRedo = g_apfnSourceSinkFuncs[iSourceSink](s);
    56925704                        pCtl->fRedo = fRedo;
    56935705                        if (RT_UNLIKELY(fRedo && !pCtl->fReset))
     
    57025714                    }
    57035715                    else
     5716                    {
     5717                        Assert(iSourceSink == ATAFN_SS_NULL);
    57045718                        ataR3CmdOK(s, 0);
     5719                    }
    57055720                    s->iIOBufferEnd = s->cbElementaryTransfer;
    57065721
     
    57785793                }
    57795794                break;
     5795            }
    57805796
    57815797            case ATA_AIO_DMA:
     
    58365852
    58375853            case ATA_AIO_PIO:
     5854            {
    58385855                s = &pCtl->aIfs[pCtl->iAIOIf & ATA_SELECTED_IF_MASK]; /* Do not remove or there's an instant crash after loading the saved state */
    58395856
    5840                 if (s->iSourceSink != ATAFN_SS_NULL)
     5857                uint8_t const iSourceSink = s->iSourceSink;
     5858                if (   iSourceSink != ATAFN_SS_NULL
     5859                    && iSourceSink < RT_ELEMENTS(g_apfnSourceSinkFuncs))
    58415860                {
    58425861                    bool fRedo;
    58435862                    Log2(("%s: Ctl#%d: calling source/sink function\n", __FUNCTION__, ATACONTROLLER_IDX(pCtl)));
    5844                     fRedo = g_apfnSourceSinkFuncs[s->iSourceSink](s);
     5863                    fRedo = g_apfnSourceSinkFuncs[iSourceSink](s);
    58455864                    pCtl->fRedo = fRedo;
    58465865                    if (RT_UNLIKELY(fRedo && !pCtl->fReset))
     
    58565875                {
    58575876                    /* Continue a previously started transfer. */
     5877                    Assert(iSourceSink == ATAFN_SS_NULL);
    58585878                    ataUnsetStatus(s, ATA_STAT_BUSY);
    58595879                    ataSetStatus(s, ATA_STAT_READY);
     
    59055925                }
    59065926                break;
     5927            }
    59075928
    59085929            case ATA_AIO_RESET_ASSERTED:
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