VirtualBox

Changeset 85145 in vbox for trunk/src/VBox/HostServices


Ignore:
Timestamp:
Jul 9, 2020 9:59:22 AM (5 years ago)
Author:
vboxsync
Message:

DnD/HostService: Improved verification of DragAndDropService::guestCall(). bugref:9777.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/DragAndDrop/VBoxDragAndDropSvc.cpp

    r85121 r85145  
    3030#include <VBox/HostServices/Service.h>
    3131#include <VBox/HostServices/DragAndDropSvc.h>
     32#include <VBox/AssertGuest.h>
    3233
    3334#include <VBox/err.h>
     
    408409    }
    409410
     411/* Verifies that an uint32 parameter has the expected buffer size set.
     412 * Will set rc to VERR_INVALID_PARAMETER otherwise. See #9777. */
     413#define VERIFY_BUFFER_SIZE_UINT32(a_ParmUInt32, a_SizeExpected) \
     414{ \
     415    uint32_t cbTemp = 0; \
     416    rc = HGCMSvcGetU32(&a_ParmUInt32, &cbTemp); \
     417    ASSERT_GUEST_STMT(RT_SUCCESS(rc) && cbTemp == a_SizeExpected, rc = VERR_INVALID_PARAMETER); \
     418}
     419
    410420    if (rc == VINF_SUCCESS) /* Note: rc might be VINF_HGCM_ASYNC_EXECUTE! */
    411421    {
     
    557567                            if (RT_SUCCESS(rc))
    558568                                rc = HGCMSvcGetPv(&paParms[1], (void **)&data.pszFormat, &data.cbFormat);
    559                             if (RT_SUCCESS(rc))
    560                                 rc = HGCMSvcGetU32(&paParms[2], &data.cbFormat);
     569                            VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.cbFormat);
    561570                        }
    562571                        break;
     
    640649                            if (RT_SUCCESS(rc))
    641650                                rc = HGCMSvcGetPv(&paParms[3], (void**)&data.pszFormat, &data.cbFormat);
    642                             if (RT_SUCCESS(rc))
    643                                 rc = HGCMSvcGetU32(&paParms[4], &data.cbFormat);
     651                            VERIFY_BUFFER_SIZE_UINT32(paParms[4], data.cbFormat);
    644652                        }
    645653                        break;
     
    684692                    if (RT_SUCCESS(rc))
    685693                        rc = HGCMSvcGetPv(&paParms[5], &data.data.pvMetaFmt, &data.data.cbMetaFmt);
    686                     if (RT_SUCCESS(rc))
    687                         rc = HGCMSvcGetU32(&paParms[6], &data.data.cbMetaFmt);
     694                    VERIFY_BUFFER_SIZE_UINT32(paParms[6], data.data.cbMetaFmt);
    688695                    if (RT_SUCCESS(rc))
    689696                        rc = HGCMSvcGetU64(&paParms[7], &data.data.cObjects);
     
    694701                    if (RT_SUCCESS(rc))
    695702                        rc = HGCMSvcGetPv(&paParms[10], &data.data.pvChecksum, &data.data.cbChecksum);
    696                     if (RT_SUCCESS(rc))
    697                         rc = HGCMSvcGetU32(&paParms[11], &data.data.cbChecksum);
    698 
     703                    VERIFY_BUFFER_SIZE_UINT32(paParms[11], data.data.cbChecksum);
    699704                    LogFlowFunc(("fFlags=0x%x, cbTotalSize=%RU64, cObj=%RU64\n",
    700705                                 data.data.uFlags, data.data.cbTotal, data.data.cObjects));
     
    718723                            if (RT_SUCCESS(rc))
    719724                                rc = HGCMSvcGetPv(&paParms[1], (void**)&data.data.u.v3.pvData, &data.data.u.v3.cbData);
    720                             if (RT_SUCCESS(rc))
    721                                 rc = HGCMSvcGetU32(&paParms[2], &data.data.u.v3.cbData);
     725                            VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.data.u.v3.cbData);
    722726                            if (RT_SUCCESS(rc))
    723727                                rc = HGCMSvcGetPv(&paParms[3], (void**)&data.data.u.v3.pvChecksum, &data.data.u.v3.cbChecksum);
    724                             if (RT_SUCCESS(rc))
    725                                 rc = HGCMSvcGetU32(&paParms[4], &data.data.u.v3.cbChecksum);
     728                            VERIFY_BUFFER_SIZE_UINT32(paParms[4], data.data.u.v3.cbChecksum);
    726729                            DO_HOST_CALLBACK();
    727730                        }
     
    764767                            if (RT_SUCCESS(rc))
    765768                                rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pszPath, &data.cbPath);
    766                             if (RT_SUCCESS(rc))
    767                                 rc = HGCMSvcGetU32(&paParms[2], &data.cbPath);
     769                            VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.cbPath);
    768770                            if (RT_SUCCESS(rc))
    769771                                rc = HGCMSvcGetU32(&paParms[3], &data.fMode);
     
    778780                        {
    779781                            rc = HGCMSvcGetPv(&paParms[0], (void**)&data.pszPath, &data.cbPath);
    780                             if (RT_SUCCESS(rc))
    781                                 rc = HGCMSvcGetU32(&paParms[1], &data.cbPath);
     782                            VERIFY_BUFFER_SIZE_UINT32(paParms[1], data.cbPath);
    782783                            if (RT_SUCCESS(rc))
    783784                                rc = HGCMSvcGetU32(&paParms[2], &data.fMode);
     
    803804                    if (RT_SUCCESS(rc))
    804805                        rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pszFilePath, &data.cbFilePath);
    805                     if (RT_SUCCESS(rc))
    806                         rc = HGCMSvcGetU32(&paParms[2], &data.cbFilePath);
     806                    VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.cbFilePath);
    807807                    if (RT_SUCCESS(rc))
    808808                        rc = HGCMSvcGetU32(&paParms[3], &data.fFlags);
     
    836836                            if (RT_SUCCESS(rc))
    837837                                rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pvData, &data.cbData);
    838                             if (RT_SUCCESS(rc))
    839                                 rc = HGCMSvcGetU32(&paParms[2], &data.cbData);
     838                            VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.cbData);
    840839                            if (RT_SUCCESS(rc))
    841840                                rc = HGCMSvcGetPv(&paParms[3], (void**)&data.u.v3.pvChecksum, &data.u.v3.cbChecksum);
    842                             if (RT_SUCCESS(rc))
    843                                 rc = HGCMSvcGetU32(&paParms[4], &data.u.v3.cbChecksum);
     841                            VERIFY_BUFFER_SIZE_UINT32(paParms[4], data.u.v3.cbChecksum);
    844842
    845843                            LogFlowFunc(("pvData=0x%p, cbData=%RU32\n", data.pvData, data.cbData));
     
    859857                            if (RT_SUCCESS(rc))
    860858                                rc = HGCMSvcGetPv(&paParms[1], (void**)&data.pvData, &data.cbData);
    861                             if (RT_SUCCESS(rc))
    862                                 rc = HGCMSvcGetU32(&paParms[2], &data.cbData);
     859                            VERIFY_BUFFER_SIZE_UINT32(paParms[2], data.cbData);
    863860
    864861                            LogFlowFunc(("cbData=%RU32, pvData=0x%p\n", data.cbData, data.pvData));
     
    875872                            RT_ZERO(data);
    876873                            data.hdr.uMagic = CB_MAGIC_DND_GH_SND_FILE_DATA;
    877                             uint32_t cTmp;
    878                             rc = HGCMSvcGetPv(&paParms[0], (void**)&data.u.v1.pszFilePath, &cTmp);
    879                             if (RT_SUCCESS(rc))
    880                                 rc = HGCMSvcGetU32(&paParms[1], &data.u.v1.cbFilePath);
    881                             if (RT_SUCCESS(rc))
    882                                 rc = HGCMSvcGetPv(&paParms[2], (void**)&data.pvData, &cTmp);
    883                             if (RT_SUCCESS(rc))
    884                                 rc = HGCMSvcGetU32(&paParms[3], &data.cbData);
     874                            rc = HGCMSvcGetPv(&paParms[0], (void**)&data.u.v1.pszFilePath, &data.u.v1.cbFilePath);
     875                            VERIFY_BUFFER_SIZE_UINT32(paParms[1], data.u.v1.cbFilePath);
     876                            if (RT_SUCCESS(rc))
     877                                rc = HGCMSvcGetPv(&paParms[2], (void**)&data.pvData, &data.cbData);
     878                            VERIFY_BUFFER_SIZE_UINT32(paParms[3], data.cbData);
    885879                            if (RT_SUCCESS(rc))
    886880                                rc = HGCMSvcGetU32(&paParms[4], &data.u.v1.fMode);
     
    982976        }
    983977    }
     978
     979#undef VERIFY_BUFFER_SIZE_UINT32
    984980
    985981    /*
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