VirtualBox

Changeset 82478 in vbox


Ignore:
Timestamp:
Dec 6, 2019 11:57:37 PM (5 years ago)
Author:
vboxsync
Message:

GuestHost/SharedClipboard-transfers.h: Removed/disabled a bunch more unnecessary SHCL_OBJ_CF_XXX flags and added code to reject invalid/unsupported flags. This will probably break older GAs from the RC and beta, but whatever. So, while at it, eliminated the stupid #pragma pack(1) stuff we've inherited from shared folders / whatever / iprt around the SHCLFSOBJATTR structure. bugref:9437

Location:
trunk
Files:
3 edited

Legend:

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

    r82465 r82478  
    8686
    8787/** Specifies an invalid Shared Clipboard list handle. */
    88 #define SHCLLISTHANDLE_INVALID        ((SHCLLISTHANDLE)~0LL)
     88#define SHCLLISTHANDLE_INVALID        ((SHCLLISTHANDLE)UINT64_MAX)
    8989
    9090/** A Shared Clipboard object handle. */
     
    9494
    9595/** Specifies an invalid Shared Clipboard object handle. */
    96 #define SHCLOBJHANDLE_INVALID         ((SHCLOBJHANDLE)~0LL)
     96#define SHCLOBJHANDLE_INVALID         ((SHCLOBJHANDLE)UINT64_MAX)
    9797
    9898/** @} */
     
    101101 *  @{
    102102 */
    103 
    104103/** No flags. Initialization value. */
    105 #define SHCL_OBJ_CF_NONE                  (0x00000000)
    106 
     104#define SHCL_OBJ_CF_NONE                    UINT32_C(0x00000000)
     105
     106#if 0 /* These probably won't be needed either */
    107107/** Lookup only the object, do not return a handle. All other flags are ignored. */
    108 #define SHCL_OBJ_CF_LOOKUP                (0x00000001)
    109 
     108#define SHCL_OBJ_CF_LOOKUP                  UINT32_C(0x00000001)
    110109/** Create/open a directory. */
    111 #define SHCL_OBJ_CF_DIRECTORY             (0x00000004)
     110#define SHCL_OBJ_CF_DIRECTORY               UINT32_C(0x00000004)
     111#endif
    112112
    113113/** Read/write requested access for the object. */
    114 #define SHCL_OBJ_CF_ACCESS_MASK_RW          (0x00001000)
    115 
     114#define SHCL_OBJ_CF_ACCESS_MASK_RW          UINT32_C(0x00001000)
    116115/** No access requested. */
    117 #define SHCL_OBJ_CF_ACCESS_NONE             (0x00000000)
     116#define SHCL_OBJ_CF_ACCESS_NONE             UINT32_C(0x00000000)
    118117/** Read access requested. */
    119 #define SHCL_OBJ_CF_ACCESS_READ             (0x00001000)
     118#define SHCL_OBJ_CF_ACCESS_READ             UINT32_C(0x00001000)
    120119
    121120/** Requested share access for the object. */
    122 #define SHCL_OBJ_CF_ACCESS_MASK_DENY        (0x0000C000)
    123 
     121#define SHCL_OBJ_CF_ACCESS_MASK_DENY        UINT32_C(0x00008000)
    124122/** Allow any access. */
    125 #define SHCL_OBJ_CF_ACCESS_DENYNONE         (0x00000000)
    126 /** Do not allow read. */
    127 #define SHCL_OBJ_CF_ACCESS_DENYREAD         (0x00004000)
     123#define SHCL_OBJ_CF_ACCESS_DENYNONE         UINT32_C(0x00000000)
    128124/** Do not allow write. */
    129 #define SHCL_OBJ_CF_ACCESS_DENYWRITE        (0x00008000)
    130 /** Do not allow access. */
    131 #define SHCL_OBJ_CF_ACCESS_DENYALL          (SHCL_OBJ_CF_ACCESS_DENYREAD | SHCL_OBJ_CF_ACCESS_DENYWRITE)
     125#define SHCL_OBJ_CF_ACCESS_DENYWRITE        UINT32_C(0x00008000)
    132126
    133127/** Requested access to attributes of the object. */
    134 #define SHCL_OBJ_CF_ACCESS_MASK_ATTR        (0x00030000)
    135 
     128#define SHCL_OBJ_CF_ACCESS_MASK_ATTR        UINT32_C(0x00010000)
    136129/** No access requested. */
    137 #define SHCL_OBJ_CF_ACCESS_ATTR_NONE        (0x00000000)
     130#define SHCL_OBJ_CF_ACCESS_ATTR_NONE        UINT32_C(0x00000000)
    138131/** Read access requested. */
    139 #define SHCL_OBJ_CF_ACCESS_ATTR_READ        (0x00010000)
    140 
     132#define SHCL_OBJ_CF_ACCESS_ATTR_READ        UINT32_C(0x00010000)
     133
     134/** Valid bits. */
     135#define SHCL_OBJ_CF_VALID_MASK              UINT32_C(0x00018000)
    141136/** @} */
    142137
    143 /** Result of an open request.
    144  *  Along with handle value the result code
    145  *  identifies what has happened while
    146  *  trying to open the object.
    147  */
    148 typedef enum _SHCLCREATERESULT
    149 {
    150     SHCL_CREATERESULT_NONE,
    151     /** Specified path does not exist. */
    152     SHCL_CREATERESULT_PATH_NOT_FOUND,
    153     /** Path to file exists, but the last component does not. */
    154     SHCL_CREATERESULT_FILE_NOT_FOUND,
    155     /** Blow the type up to 32-bit. */
    156     SHCL_CREATERESULT_32BIT_HACK = 0x7fffffff
    157 } SHCLCREATERESULT;
    158 AssertCompile(SHCL_CREATERESULT_NONE == 0);
    159 AssertCompileSize(SHCLCREATERESULT, 4);
    160 
    161138/**
    162139 * The available additional information in a SHCLFSOBJATTR object.
     140 * @sa RTFSOBJATTRADD
    163141 */
    164142typedef enum _SHCLFSOBJATTRADD
     
    191169/**
    192170 * Shared Clipboard filesystem object attributes.
    193  */
    194 #pragma pack(1)
     171 *
     172 * @sa RTFSOBJATTR
     173 */
    195174typedef struct _SHCLFSOBJATTR
    196175{
     
    263242            RTFOFF          cb;
    264243        } EASize;
     244
     245        /** Padding the structure to a multiple of 8 bytes. */
     246        uint64_t au64Padding[5];
    265247    } u;
    266248} SHCLFSOBJATTR;
    267 #pragma pack()
    268 AssertCompileSize(SHCLFSOBJATTR, 44);
     249AssertCompileSize(SHCLFSOBJATTR, 48);
    269250/** Pointer to a Shared Clipboard filesystem object attributes structure. */
    270251typedef SHCLFSOBJATTR *PSHCLFSOBJATTR;
     
    274255/**
    275256 * Shared Clipboard file system object information structure.
    276  */
    277 #pragma pack(1)
     257 *
     258 * @sa RTFSOBJINFO
     259 */
    278260typedef struct _SHCLFSOBJINFO
    279261{
     
    311293
    312294} SHCLFSOBJINFO;
    313 #pragma pack()
    314 AssertCompileSize(SHCLFSOBJINFO, 92);
     295AssertCompileSize(SHCLFSOBJINFO, 96);
    315296/** Pointer to a Shared Clipboard filesystem object information structure. */
    316297typedef SHCLFSOBJINFO *PSHCLFSOBJINFO;
     
    319300typedef const SHCLFSOBJINFO *PCSHCLFSOBJINFO;
    320301
    321 #pragma pack(1)
    322302/**
    323303 * Structure for keeping object open/create parameters.
     
    337317    SHCLFSOBJINFO    ObjInfo;
    338318} SHCLOBJOPENCREATEPARMS, *PSHCLOBJOPENCREATEPARMS;
    339 #pragma pack()
    340319
    341320/**
     
    537516
    538517/**
    539  * Class for maintaining a Shared Clipboard area
    540  * on the host or guest. This will contain all received files & directories
    541  * for a single Shared Clipboard operation.
     518 * Class for maintaining a Shared Clipboard area on the host or guest.
     519 *
     520 * This will contain all received files & directories for a single Shared
     521 * Clipboard operation.
    542522 *
    543523 * In case of a failed Shared Clipboard operation this class can also
     
    632612    SHCLTRANSFEROBJSTATE State;
    633613} SHCLTRANSFEROBJ, *PSHCLTRANSFEROBJ;
    634 
    635 /** Defines a transfer ID. */
    636 typedef uint16_t SHCLTRANSFERID;
    637614
    638615/**
     
    743720 * This is handed in to the provider implementation callbacks.
    744721 */
    745     typedef struct _SHCLPROVIDERCTX
     722typedef struct _SHCLPROVIDERCTX
    746723{
    747724    /** Pointer to the related Shared Clipboard transfer. */
     
    752729
    753730/** @todo r=bird: These macros must go as they do no lend themselves to writing
    754  *        sane documentation.  Use the DECLCALLBACK macro instead, as you
     731 *        sane documentation.  Use the DECLCALLBACKMEMBER macro instead, as you
    755732 *        probably do not need the function and function pointer typedefs.
    756733 *
     
    913890    /** The node member for using this struct in a RTList. */
    914891    RTLISTNODE               Node;
    915     /** Critical section for serializing access. */
    916     RTCRITSECT               CritSect;
    917892    /** The transfer's state (for SSM, later). */
    918893    SHCLTRANSFERSTATE        State;
     894    /** Absolute path to root entries. */
     895    char                    *pszPathRootAbs;
    919896    /** Timeout (in ms) for waiting of events. Default is 30s. */
    920897    RTMSINTERVAL             uTimeoutMs;
    921     /** Absolute path to root entries. */
    922     char                    *pszPathRootAbs;
    923898    /** Maximum data chunk size (in bytes) to transfer. Default is 64K. */
    924899    uint32_t                 cbMaxChunkSize;
     
    961936    /** Contains thread-related attributes. */
    962937    SHCLTRANSFERTHREAD       Thread;
     938    /** Critical section for serializing access. */
     939    RTCRITSECT               CritSect;
    963940} SHCLTRANSFER, *PSHCLTRANSFER;
    964941
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r82465 r82478  
    3434static int shClTransferThreadDestroy(PSHCLTRANSFER pTransfer, RTMSINTERVAL uTimeoutMs);
    3535static PSHCLTRANSFER shClTransferCtxGetTransferInternal(PSHCLTRANSFERCTX pTransferCtx, uint32_t uIdx);
    36 static int shClConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode, SHCLOBJHANDLE handleInitial, uint64_t *pfOpen);
     36static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen);
    3737static int shClTransferResolvePathAbs(PSHCLTRANSFER pTransfer, const char *pszPath, uint32_t fFlags, char **ppszResolved);
    3838
     
    796796 * @param   phObj               Where to store the handle of transfer object opened on success.
    797797 */
    798 int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms,
    799                         PSHCLOBJHANDLE phObj)
     798int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms, PSHCLOBJHANDLE phObj)
    800799{
    801800    AssertPtrReturn(pTransfer,        VERR_INVALID_POINTER);
    802801    AssertPtrReturn(pOpenCreateParms, VERR_INVALID_POINTER);
    803802    AssertPtrReturn(phObj,            VERR_INVALID_POINTER);
    804 
    805     int rc = VINF_SUCCESS;
    806 
    807803    AssertMsgReturn(pTransfer->pszPathRootAbs, ("Transfer has no root path set\n"), VERR_INVALID_PARAMETER);
    808804    AssertMsgReturn(pOpenCreateParms->pszPath, ("No path in open/create params set\n"), VERR_INVALID_PARAMETER);
    809805
    810     if (pTransfer->cObjHandles == pTransfer->cMaxObjHandles)
     806    if (pTransfer->cObjHandles >= pTransfer->cMaxObjHandles)
    811807        return VERR_SHCLPB_MAX_OBJECTS_REACHED;
    812808
    813809    LogFlowFunc(("pszPath=%s, fCreate=0x%x\n", pOpenCreateParms->pszPath, pOpenCreateParms->fCreate));
    814810
     811    int rc;
    815812    if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
    816813    {
    817         PSHCLOBJHANDLEINFO pInfo
    818             = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
     814        PSHCLOBJHANDLEINFO pInfo = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
    819815        if (pInfo)
    820816        {
     
    822818            if (RT_SUCCESS(rc))
    823819            {
    824 
    825                 /* Only if this is a read transfer (locally) we're able to actually write to files
    826                  * (we're reading from the source). */
    827                 const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE;
    828 
    829820                uint64_t fOpen;
    830                 rc = shClConvertFileCreateFlags(fWritable,
    831                                                 pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
    832                                                 SHCLOBJHANDLE_INVALID, &fOpen);
     821                rc = shClConvertFileCreateFlags(pOpenCreateParms->fCreate, &fOpen);
    833822                if (RT_SUCCESS(rc))
    834823                {
     
    839828                        rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
    840829                        if (RT_SUCCESS(rc))
    841                         {
    842830                            LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
    843                         }
    844831                        else
    845                             LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
     832                            LogRel(("Shared Clipboard: Error opening file '%s': rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
    846833                    }
    847834                }
     
    872859    {
    873860        if (pTransfer->ProviderIface.pfnObjOpen)
    874         {
    875861            rc = pTransfer->ProviderIface.pfnObjOpen(&pTransfer->ProviderCtx, pOpenCreateParms, phObj);
    876         }
    877862        else
    878863            rc = VERR_NOT_SUPPORTED;
     
    30122997 *
    30132998 * @returns IPRT status code.
    3014  * @param  fWritable            Whether the object is writable.
    3015  * @param  fShClFlags           Shared clipboard create flags.
    3016  * @param  fMode                File attributes.
    3017  * @param  handleInitial        Initial handle.
    3018  * @retval pfOpen               Where to store the IPRT creation / open flags.
     2999 * @param       fShClFlags  Shared clipboard create flags.
     3000 * @param[out]  pfOpen      Where to store the RTFILE_O_XXX flags for
     3001 *                          RTFileOpen.
    30193002 *
    30203003 * @sa Initially taken from vbsfConvertFileOpenFlags().
    30213004 */
    3022 static int shClConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode,
    3023                                       SHCLOBJHANDLE handleInitial, uint64_t *pfOpen)
    3024 {
     3005static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen)
     3006{
     3007    AssertMsgReturnStmt(!(fShClFlags & ~SHCL_OBJ_CF_VALID_MASK), ("%#x4\n", fShClFlags), *pfOpen = 0, VERR_INVALID_FLAGS);
     3008
    30253009    uint64_t fOpen = 0;
    3026     int rc = VINF_SUCCESS;
    3027 
    3028     if (   (fMode & RTFS_DOS_MASK) != 0
    3029         && (fMode & RTFS_UNIX_MASK) == 0)
    3030     {
    3031         /* A DOS/Windows guest, make RTFS_UNIX_* from RTFS_DOS_*.
    3032          * @todo this is based on rtFsModeNormalize/rtFsModeFromDos.
    3033          *       May be better to use RTFsModeNormalize here.
    3034          */
    3035         fMode |= RTFS_UNIX_IRUSR | RTFS_UNIX_IRGRP | RTFS_UNIX_IROTH;
    3036         /* x for directories. */
    3037         if (fMode & RTFS_DOS_DIRECTORY)
    3038             fMode |= RTFS_TYPE_DIRECTORY | RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;
    3039         /* writable? */
    3040         if (!(fMode & RTFS_DOS_READONLY))
    3041             fMode |= RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH;
    3042 
    3043         /* Set the requested mode using only allowed bits. */
    3044         fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK;
    3045     }
    3046     else
    3047     {
    3048         /* Old linux and solaris additions did not initialize the Info.Attr.fMode field
    3049          * and it contained random bits from stack. Detect this using the handle field value
    3050          * passed from the guest: old additions set it (incorrectly) to 0, new additions
    3051          * set it to SHCLOBJHANDLE_INVALID(~0).
    3052          */
    3053         if (handleInitial == 0)
    3054         {
    3055             /* Old additions. Do nothing, use default mode. */
    3056         }
    3057         else
    3058         {
    3059             /* New additions or Windows additions. Set the requested mode using only allowed bits.
    3060              * Note: Windows guest set RTFS_UNIX_MASK bits to 0, which means a default mode
    3061              *       will be set in fOpen.
    3062              */
    3063             fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK;
    3064         }
    3065     }
    3066 
    3067     switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW))
    3068     {
    3069         default:
    3070             RT_FALL_THROUGH();
     3010
     3011    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW)
     3012    {
    30713013        case SHCL_OBJ_CF_ACCESS_NONE:
    30723014        {
     
    30873029            break;
    30883030        }
    3089     }
    3090 
    3091     switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR))
    3092     {
     3031
    30933032        default:
    3094             RT_FALL_THROUGH();
     3033            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     3034    }
     3035
     3036    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR)
     3037    {
    30953038        case SHCL_OBJ_CF_ACCESS_ATTR_NONE:
    30963039        {
     
    31063049            break;
    31073050        }
     3051
     3052        default:
     3053            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
    31083054    }
    31093055
    31103056    /* Sharing mask */
    3111     switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY))
    3112     {
    3113         default:
     3057    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY)
     3058    {
    31143059        case SHCL_OBJ_CF_ACCESS_DENYNONE:
    31153060            fOpen |= RTFILE_O_DENY_NONE;
     
    31173062            break;
    31183063
    3119         case SHCL_OBJ_CF_ACCESS_DENYREAD:
    3120             fOpen |= RTFILE_O_DENY_READ;
    3121             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYREAD\n"));
    3122             break;
    3123 
    31243064        case SHCL_OBJ_CF_ACCESS_DENYWRITE:
    31253065            fOpen |= RTFILE_O_DENY_WRITE;
     
    31273067            break;
    31283068
    3129         case SHCL_OBJ_CF_ACCESS_DENYALL:
    3130             fOpen |= RTFILE_O_DENY_ALL;
    3131             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYALL\n"));
    3132             break;
    3133     }
    3134 
    3135     if (RT_SUCCESS(rc))
    3136     {
    3137         if (!fWritable)
    3138             fOpen &= ~RTFILE_O_WRITE;
    3139 
    3140         *pfOpen = fOpen;
    3141     }
    3142 
    3143     LogFlowFuncLeaveRC(rc);
    3144     return rc;
     3069        default:
     3070            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     3071    }
     3072
     3073    *pfOpen = fOpen;
     3074
     3075    LogFlowFuncLeaveRC(VINF_SUCCESS);
     3076    return VINF_SUCCESS;
    31453077}
    31463078
  • trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp

    r82462 r82478  
    13701370            if (!pTransfer)
    13711371            {
    1372                 LogFunc(("Transfer with ID %RU32 not found\n", uTransferID));
     1372                LogFunc(("Transfer with ID %RU16 not found\n", uTransferID));
    13731373                rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND;
    13741374            }
     
    16151615        case VBOX_SHCL_GUEST_FN_OBJ_OPEN:
    16161616        {
    1617             if (cParms != VBOX_SHCL_CPARMS_OBJ_OPEN)
    1618                 break;
     1617            ASSERT_GUEST_STMT_BREAK(cParms == VBOX_SHCL_CPARMS_OBJ_OPEN, VERR_WRONG_PARAMETER_COUNT);
    16191618
    16201619            SHCLOBJOPENCREATEPARMS openCreateParms;
     
    16221621
    16231622            uint32_t cbPath;
    1624             rc = HGCMSvcGetU32(&paParms[2], &cbPath);
    1625             if (RT_SUCCESS(rc))
    1626             {
     1623            rc = HGCMSvcGetU32(&paParms[2], &cbPath); /** @todo r=bird: This is an pointless parameter. */
     1624            if (RT_SUCCESS(rc))
     1625            {
     1626                /** @todo r=bird: This is the wrong way of getting a string!   */
    16271627                rc = HGCMSvcGetPv(&paParms[3], (void **)&openCreateParms.pszPath, &openCreateParms.cbPath);
    16281628                if (cbPath != openCreateParms.cbPath)
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