Changeset 49421 in vbox for trunk/src/VBox/Devices/VMMDev
- Timestamp:
- Nov 8, 2013 3:55:56 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 90502
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
r49411 r49421 106 106 */ 107 107 VBOXHGCMSVCPARM *paHostParms; 108 109 /* Number of elements in paHostParms */ 110 uint32_t cHostParms; 108 111 109 112 /** Linear pointer parameters information. */ … … 262 265 int rc = VINF_SUCCESS; 263 266 264 AssertRelease (u32Size > 0);265 266 267 VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr]; 267 268 … … 305 306 GCPtr += PAGE_SIZE; 306 307 } 307 308 AssertRelease (iPage == cPages);309 308 310 309 return rc; … … 322 321 VBOXHGCMLINPTR *pLinPtr = &paLinPtrs[iLinPtr]; 323 322 324 Assert Release (u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm);323 AssertLogRelReturn(u32Size > 0 && iParm == (uint32_t)pLinPtr->iParm, VERR_INVALID_PARAMETER); 325 324 326 325 RTGCPHYS GCPhysDst = pLinPtr->paPages[0] + pLinPtr->offFirstPage; … … 344 343 if (cbWrite >= u32Size) 345 344 { 346 PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size); 345 rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, u32Size); 346 if (RT_FAILURE(rc)) 347 break; 348 347 349 u32Size = 0; 348 350 break; 349 351 } 350 352 351 PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite); 353 rc = PDMDevHlpPhysWrite(pDevIns, GCPhysDst, pu8Src, cbWrite); 354 if (RT_FAILURE(rc)) 355 break; 352 356 353 357 /* next */ … … 358 362 } 359 363 360 AssertRelease (iPage == pLinPtr->cPages); 361 Assert(u32Size == 0); 364 if (RT_SUCCESS(rc)) 365 { 366 AssertLogRelReturn(iPage == pLinPtr->cPages, VERR_INVALID_PARAMETER); 367 } 362 368 363 369 return rc; … … 813 819 814 820 pCmd->paHostParms = pHostParm; 821 pCmd->cHostParms = cParms; 815 822 816 823 uint32_t iLinPtr = 0; … … 1329 1336 1330 1337 pCmd->paHostParms = pHostParm; 1338 pCmd->cHostParms = cParms; 1331 1339 1332 1340 uint32_t iParm; … … 1798 1806 } 1799 1807 1808 #ifdef VBOX_WITH_64_BITS_GUESTS 1809 static 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 1849 static int vmmdevHGCMParmVerify32(HGCMFunctionParameter32 *pGuestParm, VBOXHGCMSVCPARM *pHostParm) 1850 #else 1851 static 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 1800 1890 DECLCALLBACK(void) hgcmCompletedWorker (PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmd) 1801 1891 { … … 1895 1985 1896 1986 uint32_t cParms = pHGCMCall->cParms; 1987 if (cParms != pCmd->cHostParms) 1988 rc = VERR_INVALID_PARAMETER; 1897 1989 1898 1990 VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms; … … 1903 1995 HGCMFunctionParameter64 *pGuestParm = VMMDEV_HGCM_CALL_PARMS64(pHGCMCall); 1904 1996 1905 for (i = 0; i < cParms ; i++, pGuestParm++, pHostParm++)1997 for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++) 1906 1998 { 1999 rc = vmmdevHGCMParmVerify64(pGuestParm, pHostParm); 2000 if (RT_FAILURE(rc)) 2001 break; 2002 1907 2003 switch (pGuestParm->type) 1908 2004 { … … 1931 2027 rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, 1932 2028 size, iLinPtr, pCmd->paLinPtrs); 1933 AssertReleaseRC(rc);1934 2029 } 1935 2030 … … 1982 2077 { 1983 2078 /* 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; 1985 2081 } 1986 2082 } … … 1998 2094 1999 2095 uint32_t cParms = pHGCMCall->cParms; 2096 if (cParms != pCmd->cHostParms) 2097 rc = VERR_INVALID_PARAMETER; 2000 2098 2001 2099 VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms; … … 2006 2104 HGCMFunctionParameter32 *pGuestParm = VMMDEV_HGCM_CALL_PARMS32(pHGCMCall); 2007 2105 2008 for (i = 0; i < cParms ; i++, pGuestParm++, pHostParm++)2106 for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++) 2009 2107 { 2108 rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm); 2109 if (RT_FAILURE(rc)) 2110 break; 2111 2010 2112 switch (pGuestParm->type) 2011 2113 { … … 2033 2135 /* Use the saved page list to write data back to the guest RAM. */ 2034 2136 rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs); 2035 AssertReleaseRC(rc);2036 2137 } 2037 2138 … … 2084 2185 { 2085 2186 /* 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; 2087 2189 } 2088 2190 } … … 2100 2202 2101 2203 uint32_t cParms = pHGCMCall->cParms; 2204 if (cParms != pCmd->cHostParms) 2205 rc = VERR_INVALID_PARAMETER; 2102 2206 2103 2207 VBOXHGCMSVCPARM *pHostParm = pCmd->paHostParms; … … 2108 2212 HGCMFunctionParameter *pGuestParm = VMMDEV_HGCM_CALL_PARMS(pHGCMCall); 2109 2213 2110 for (i = 0; i < cParms ; i++, pGuestParm++, pHostParm++)2214 for (i = 0; i < cParms && RT_SUCCESS(rc); i++, pGuestParm++, pHostParm++) 2111 2215 { 2216 rc = vmmdevHGCMParmVerify32(pGuestParm, pHostParm); 2217 if (RT_FAILURE(rc)) 2218 break; 2219 2112 2220 switch (pGuestParm->type) 2113 2221 { … … 2135 2243 /* Use the saved page list to write data back to the guest RAM. */ 2136 2244 rc = vmmdevHGCMWriteLinPtr (pThis->pDevIns, i, pHostParm->u.pointer.addr, size, iLinPtr, pCmd->paLinPtrs); 2137 AssertReleaseRC(rc);2138 2245 } 2139 2246 … … 2186 2293 { 2187 2294 /* 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; 2189 2297 } 2190 2298 } … … 2212 2320 } 2213 2321 } 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; 2218 2327 } 2219 2328
Note:
See TracChangeset
for help on using the changeset viewer.