VirtualBox

Changeset 81324 in vbox


Ignore:
Timestamp:
Oct 17, 2019 3:51:59 PM (5 years ago)
Author:
vboxsync
Message:

Shared Clipboard/Transfers: Added more checking for open/create parameters in ShClTransferObjOpen(). Untested.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/GuestHost/SharedClipboard-transfers.h

    r81322 r81324  
    787787    /** The transfer's current status. */
    788788    SHCLTRANSFERSTATUS enmStatus;
    789     /** The transfer's direction. */
     789    /** The transfer's direction, seen from the perspective who created the transfer. */
    790790    SHCLTRANSFERDIR    enmDir;
    791     /** The transfer's source. */
     791    /** The transfer's source, seen from the perspective who created the transfer. */
    792792    SHCLSOURCE         enmSource;
    793793} SHCLTRANSFERSTATE, *PSHCLTRANSFERSTATE;
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r81323 r81324  
    808808            if (RT_SUCCESS(rc))
    809809            {
    810                 const bool fWritable = true; /** @todo Fix this. */
    811 
    812                 uint64_t fOpen;
    813                 rc = shClConvertFileCreateFlags(fWritable,
    814                                                 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
    815                                                 SHCLOBJHANDLE_INVALID, &fOpen);
     810                /*
     811                 * Make sure the transfer direction matches the open/create parameters.
     812                 */
     813                if (pTransfer->State.enmDir == SHCLTRANSFERDIR_READ)
     814                {
     815                    if (pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_READ) /* Read access wanted? */
     816                    {
     817                        AssertMsgFailed(("Is not a write transfer, but object open flags are set to read access (0x%x)\n",
     818                                         pOpenCreateParms->fCreate)); /* Should never happen. */
     819                        rc = VERR_INVALID_PARAMETER;
     820                    }
     821                }
     822                else if (pTransfer->State.enmDir == SHCLTRANSFERDIR_WRITE)
     823                {
     824                    if (pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_WRITE) /* Write access wanted? */
     825                    {
     826                        AssertMsgFailed(("Is not a read transfer, but object open flags are set to write access (0x%x)\n",
     827                                         pOpenCreateParms->fCreate)); /* Should never happen. */
     828                        rc = VERR_INVALID_PARAMETER;
     829                    }
     830                }
     831                else
     832                {
     833                    AssertFailed();
     834                    rc = VERR_NOT_SUPPORTED;
     835                }
     836
    816837                if (RT_SUCCESS(rc))
    817838                {
    818                     rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */, &pInfo->pszPathLocalAbs);
     839                    /* Only if this is a read transfer (locally) we're able to actually write to files
     840                     * (we're reading from the source). */
     841                    const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_READ;
     842
     843                    uint64_t fOpen;
     844                    rc = shClConvertFileCreateFlags(fWritable,
     845                                                    pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
     846                                                    SHCLOBJHANDLE_INVALID, &fOpen);
    819847                    if (RT_SUCCESS(rc))
    820848                    {
    821                         rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
     849                        rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */, &pInfo->pszPathLocalAbs);
    822850                        if (RT_SUCCESS(rc))
    823851                        {
    824                             LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
     852                            rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
     853                            if (RT_SUCCESS(rc))
     854                            {
     855                                LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
     856                            }
     857                            else
     858                                LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
    825859                        }
    826                         else
    827                             LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
    828860                    }
    829861                }
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