VirtualBox

Changeset 49421 in vbox for trunk/src/VBox/Devices/VMMDev


Ignore:
Timestamp:
Nov 8, 2013 3:55:56 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
90502
Message:

VMMDev: removed obsolete assertions, cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp

    r49411 r49421  
    106106     */
    107107    VBOXHGCMSVCPARM *paHostParms;
     108
     109    /* Number of elements in paHostParms */
     110    uint32_t cHostParms;
    108111
    109112    /** Linear pointer parameters information. */
     
    262265    int rc = VINF_SUCCESS;
    263266
    264     AssertRelease (u32Size > 0);
    265 
    266267    VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr];
    267268
     
    305306        GCPtr += PAGE_SIZE;
    306307    }
    307 
    308     AssertRelease (iPage == cPages);
    309308
    310309    return rc;
     
    322321    VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr];
    323322
    324     AssertRelease (u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm);
     323    AssertLogRelReturn(u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm, VERR_INVALID_PARAMETER);
    325324
    326325    RTGCPHYS GCPhysDst = pLinPtr->paPages[0] + pLinPtr->offFirstPage;
     
    344343        if (cbWrite >= u32Size)
    345344        {
    346             PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size);
     345            rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size);
     346            if (RT_FAILURE(rc))
     347                break;
     348
    347349            u32Size = 0;
    348350            break;
    349351        }
    350352
    351         PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite);
     353        rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite);
     354        if (RT_FAILURE(rc))
     355            break;
    352356
    353357        /* next */
     
    358362    }
    359363
    360     AssertRelease (iPage == pLinPtr->cPages);
    361     Assert(u32Size == 0);
     364    if (RT_SUCCESS(rc))
     365    {
     366        AssertLogRelReturn(iPage == pLinPtr->cPages, VERR_INVALID_PARAMETER);
     367    }
    362368
    363369    return rc;
     
    813819
    814820        pCmd->paHostParms = pHostParm;
     821        pCmd->cHostParms  = cParms;
    815822
    816823        uint32_t iLinPtr = 0;
     
    13291336
    13301337        pCmd->paHostParms = pHostParm;
     1338        pCmd->cHostParms = cParms;
    13311339
    13321340        uint32_t iParm;
     
    17981806}
    17991807
     1808#ifdef VBOX_WITH_64_BITS_GUESTS
     1809static int vmmdevHGCMParmVerify64(HGCMFunctionParameter64 *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
     1810{
     1811    int rc = VERR_INVALID_PARAMETER;
     1812
     1813    switch (pGuestParm->type)
     1814    {
     1815        case VMMDevHGCMParmType_32bit:
     1816            if (pHostParm->type == VBOX_HGCM_SVC_PARM_32BIT)
     1817                rc = VINF_SUCCESS;
     1818            break;
     1819
     1820        case VMMDevHGCMParmType_64bit:
     1821            if (pHostParm->type == VBOX_HGCM_SVC_PARM_64BIT)
     1822                rc = VINF_SUCCESS;
     1823            break;
     1824
     1825        case VMMDevHGCMParmType_LinAddr_In:  /* In (read) */
     1826        case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */
     1827        case VMMDevHGCMParmType_LinAddr:     /* In & Out */
     1828            if (   pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
     1829                && pGuestParm->u.Pointer.size == pHostParm->u.pointer.size)
     1830                rc = VINF_SUCCESS;
     1831            break;
     1832
     1833        case VMMDevHGCMParmType_PageList:
     1834            if (   pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
     1835                && pGuestParm->u.PageList.size == pHostParm->u.pointer.size)
     1836                rc = VINF_SUCCESS;
     1837            break;
     1838
     1839        default:
     1840            AssertLogRelMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
     1841            break;
     1842    }
     1843
     1844    return rc;
     1845}
     1846#endif /* VBOX_WITH_64_BITS_GUESTS */
     1847
     1848#ifdef VBOX_WITH_64_BITS_GUESTS
     1849static int vmmdevHGCMParmVerify32(HGCMFunctionParameter32 *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
     1850#else
     1851static int vmmdevHGCMParmVerify32(HGCMFunctionParameter *pGuestParm, VBOXHGCMSVCPARM *pHostParm)
     1852#endif
     1853{
     1854    int rc = VERR_INVALID_PARAMETER;
     1855
     1856    switch (pGuestParm->type)
     1857    {
     1858        case VMMDevHGCMParmType_32bit:
     1859            if (pHostParm->type == VBOX_HGCM_SVC_PARM_32BIT)
     1860                rc = VINF_SUCCESS;
     1861            break;
     1862
     1863        case VMMDevHGCMParmType_64bit:
     1864            if (pHostParm->type == VBOX_HGCM_SVC_PARM_64BIT)
     1865                rc = VINF_SUCCESS;
     1866            break;
     1867
     1868        case VMMDevHGCMParmType_LinAddr_In:  /* In (read) */
     1869        case VMMDevHGCMParmType_LinAddr_Out: /* Out (write) */
     1870        case VMMDevHGCMParmType_LinAddr:     /* In & Out */
     1871            if (   pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
     1872                && pGuestParm->u.Pointer.size == pHostParm->u.pointer.size)
     1873                rc = VINF_SUCCESS;
     1874            break;
     1875
     1876        case VMMDevHGCMParmType_PageList:
     1877            if (   pHostParm->type == VBOX_HGCM_SVC_PARM_PTR
     1878                && pGuestParm->u.PageList.size == pHostParm->u.pointer.size)
     1879                rc = VINF_SUCCESS;
     1880            break;
     1881
     1882        default:
     1883            AssertLogRelMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
     1884            break;
     1885    }
     1886
     1887    return rc;
     1888}
     1889
    18001890DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmd)
    18011891{
     
    18951985
    18961986                uint32_t cParms = pHGCMCall->cParms;
     1987                if (cParms != pCmd->cHostParms)
     1988                    rc = VERR_INVALID_PARAMETER;
    18971989
    18981990                VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
     
    19031995                HGCMFunctionParameter64 *pGuestParm = VMMDEV_HGCM_CALL_PARMS64(pHGCMCall);
    19041996
    1905                 for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
     1997                for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
    19061998                {
     1999                    rc = vmmdevHGCMParmVerify64(pGuestParm, pHostParm);
     2000                    if (RT_FAILURE(rc))
     2001                        break;
     2002
    19072003                    switch (pGuestParm->type)
    19082004                    {
     
    19312027                                    rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr,
    19322028                                                                size, iLinPtr, pCmd->paLinPtrs);
    1933                                     AssertReleaseRC(rc);
    19342029                                }
    19352030
     
    19822077                        {
    19832078                            /* This indicates that the guest request memory was corrupted. */
    1984                             AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
     2079                            rc = VERR_INVALID_PARAMETER;
     2080                            break;
    19852081                        }
    19862082                    }
     
    19982094
    19992095                uint32_t cParms = pHGCMCall->cParms;
     2096                if (cParms != pCmd->cHostParms)
     2097                    rc = VERR_INVALID_PARAMETER;
    20002098
    20012099                VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
     
    20062104                HGCMFunctionParameter32 *pGuestParm = VMMDEV_HGCM_CALL_PARMS32(pHGCMCall);
    20072105
    2008                 for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
     2106                for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
    20092107                {
     2108                    rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm);
     2109                    if (RT_FAILURE(rc))
     2110                        break;
     2111
    20102112                    switch (pGuestParm->type)
    20112113                    {
     
    20332135                                    /* Use the saved page list to write data back to the guest RAM. */
    20342136                                    rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
    2035                                     AssertReleaseRC(rc);
    20362137                                }
    20372138
     
    20842185                        {
    20852186                            /* This indicates that the guest request memory was corrupted. */
    2086                             AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
     2187                            rc = VERR_INVALID_PARAMETER;
     2188                            break;
    20872189                        }
    20882190                    }
     
    21002202
    21012203                uint32_t cParms = pHGCMCall->cParms;
     2204                if (cParms != pCmd->cHostParms)
     2205                    rc = VERR_INVALID_PARAMETER;
    21022206
    21032207                VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms;
     
    21082212                HGCMFunctionParameter *pGuestParm = VMMDEV_HGCM_CALL_PARMS(pHGCMCall);
    21092213
    2110                 for (i = 0; i < cParms; i++, pGuestParm++, pHostParm++)
     2214                for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++)
    21112215                {
     2216                    rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm);
     2217                    if (RT_FAILURE(rc))
     2218                        break;
     2219
    21122220                    switch (pGuestParm->type)
    21132221                    {
     
    21352243                                    /* Use the saved page list to write data back to the guest RAM. */
    21362244                                    rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs);
    2137                                     AssertReleaseRC(rc);
    21382245                                }
    21392246
     
    21862293                        {
    21872294                            /* This indicates that the guest request memory was corrupted. */
    2188                             AssertReleaseMsgFailed(("hgcmCompleted: invalid parameter type %08X\n", pGuestParm->type));
     2295                            rc = VERR_INVALID_PARAMETER;
     2296                            break;
    21892297                        }
    21902298                    }
     
    22122320            }
    22132321        }
    2214         else
    2215         {
    2216             /* Command type is wrong. Return error to the guest. */
    2217             pHeader->header.rc = rc;
     2322
     2323        if (RT_FAILURE(rc))
     2324        {
     2325            /* Command is wrong. Return HGCM error result to the guest. */
     2326            pHeader->result = rc;
    22182327        }
    22192328
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