VirtualBox

Changeset 54027 in vbox


Ignore:
Timestamp:
Jan 29, 2015 3:23:36 PM (10 years ago)
Author:
vboxsync
Message:

Main/cbinding: Add new helper functions to clear out strings (useful if they contain sensitive data). While doing this, added code to the glue init which checks if the version of the structure is compatible with what the client expects. This exposed annoying code duplication between the non-Windows/Windows implementations which is now eliminated.

Location:
trunk/src/VBox/Main/cbinding
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/cbinding/VBoxCAPI.cpp

    r50930 r54027  
    55
    66/*
    7  * Copyright (C) 2009-2014 Oracle Corporation
     7 * Copyright (C) 2009-2015 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    8383    return vrc;
    8484#endif /* !VBOX_WITH_XPCOM */
     85}
     86
     87static void
     88VBoxUtf8Clear(char *pszString)
     89{
     90    RT_BZERO(pszString, strlen(pszString));
     91}
     92
     93static void
     94VBoxUtf16Clear(BSTR pwszString)
     95{
     96    RT_BZERO(pwszString, RTUtf16Len(pwszString) * sizeof(RTUTF16));
    8597}
    8698
     
    760772        VBoxInterruptEventQueueProcessing,
    761773
     774        VBoxUtf8Clear,
     775        VBoxUtf16Clear,
     776
    762777        VBOX_CAPI_VERSION
    763778    };
     
    767782
    768783    /*
    769      * Legacy interface version 4.0.
     784     * Legacy interface version 3.0.
    770785     */
    771     static const struct VBOXCAPIV4
     786    static const struct VBOXCAPIV3
    772787    {
    773788        /** The size of the structure. */
     
    777792
    778793        unsigned int (*pfnGetVersion)(void);
     794
    779795        unsigned int (*pfnGetAPIVersion)(void);
    780796
    781797        HRESULT (*pfnClientInitialize)(const char *pszVirtualBoxClientIID,
    782798                                       IVirtualBoxClient **ppVirtualBoxClient);
    783         HRESULT (*pfnClientThreadInitialize)(void);
    784         HRESULT (*pfnClientThreadUninitialize)(void);
    785799        void (*pfnClientUninitialize)(void);
    786800
    787         void  (*pfnComInitialize)(const char *pszVirtualBoxIID,
    788                                   IVirtualBox **ppVirtualBox,
    789                                   const char *pszSessionIID,
    790                                   ISession **ppSession);
    791 
    792         void  (*pfnComUninitialize)(void);
    793 
    794         void (*pfnComUnallocString)(BSTR pwsz);
    795 
    796         int   (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
    797         int   (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
    798         void  (*pfnUtf8Free)(char *pszString);
    799         void  (*pfnUtf16Free)(BSTR pwszString);
    800 
    801         SAFEARRAY *(*pfnSafeArrayCreateVector)(VARTYPE vt, LONG lLbound, ULONG cElements);
    802         SAFEARRAY *(*pfnSafeArrayOutParamAlloc)(void);
    803         HRESULT (*pfnSafeArrayCopyInParamHelper)(SAFEARRAY *psa, const void *pv, ULONG cb);
    804         HRESULT (*pfnSafeArrayCopyOutParamHelper)(void **ppv, ULONG *pcb, VARTYPE vt, SAFEARRAY *psa);
    805         HRESULT (*pfnSafeArrayCopyOutIfaceParamHelper)(IUnknown ***ppaObj, ULONG *pcObj, SAFEARRAY *psa);
    806         HRESULT (*pfnSafeArrayDestroy)(SAFEARRAY *psa);
    807 
    808 #ifdef VBOX_WITH_XPCOM
    809         void  (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
     801        void (*pfnComInitialize)(const char *pszVirtualBoxIID,
     802                                 IVirtualBox **ppVirtualBox,
     803                                 const char *pszSessionIID,
     804                                 ISession **ppSession);
     805
     806        void (*pfnComUninitialize)(void);
     807
     808        void (*pfnComUnallocMem)(void *pv);
     809
     810        int (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
     811        int (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
     812        void (*pfnUtf8Free)(char *pszString);
     813        void (*pfnUtf16Free)(BSTR pwszString);
     814
     815#ifdef VBOX_WITH_XPCOM
     816        void (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
    810817#endif /* VBOX_WITH_XPCOM */
    811818        HRESULT (*pfnGetException)(IErrorInfo **ppException);
    812819        HRESULT (*pfnClearException)(void);
    813         int (*pfnProcessEventQueue)(LONG64 iTimeoutMS);
    814         int (*pfnInterruptEventQueueProcessing)(void);
    815820
    816821        /** Tail version, same as uVersion. */
    817822        unsigned uEndVersion;
    818     } s_Functions_v4_0 =
    819     {
    820         sizeof(s_Functions_v4_0),
    821         0x00040000U,
     823    } s_Functions_v3_0 =
     824    {
     825        sizeof(s_Functions_v3_0),
     826        0x00030000U,
    822827
    823828        VBoxVersion,
     
    825830
    826831        VBoxClientInitialize,
    827         VBoxClientThreadInitialize,
    828         VBoxClientThreadUninitialize,
    829832        VBoxClientUninitialize,
    830833
     
    832835        VBoxComUninitialize,
    833836
    834         VBoxComUnallocString,
     837        VBoxComUnallocMem,
    835838
    836839        VBoxUtf16ToUtf8,
     
    839842        VBoxUtf16Free,
    840843
    841         VBoxSafeArrayCreateVector,
    842         VBoxSafeArrayOutParamAlloc,
    843         VBoxSafeArrayCopyInParamHelper,
    844         VBoxSafeArrayCopyOutParamHelper,
    845         VBoxSafeArrayCopyOutIfaceParamHelper,
    846         VBoxSafeArrayDestroy,
    847 
    848844#ifdef VBOX_WITH_XPCOM
    849845        VBoxGetEventQueue,
     
    851847        VBoxGetException,
    852848        VBoxClearException,
    853         VBoxProcessEventQueue,
    854         VBoxInterruptEventQueueProcessing,
    855 
    856         0x00040000U
     849
     850        0x00030000U
    857851    };
    858852
    859     if ((uVersion & 0xffff0000U) == 0x00040000U)
    860         return (PCVBOXCAPI)&s_Functions_v4_0;
     853    if ((uVersion & 0xffff0000U) == 0x00030000U)
     854        return (PCVBOXCAPI)&s_Functions_v3_0;
    861855
    862856    /*
    863      * Legacy interface version 3.0.
     857     * Legacy interface version 2.0.
    864858     */
    865     static const struct VBOXCAPIV3
     859    static const struct VBOXCAPIV2
    866860    {
    867861        /** The size of the structure. */
     
    872866        unsigned int (*pfnGetVersion)(void);
    873867
    874         unsigned int (*pfnGetAPIVersion)(void);
    875 
    876         HRESULT (*pfnClientInitialize)(const char *pszVirtualBoxClientIID,
    877                                        IVirtualBoxClient **ppVirtualBoxClient);
    878         void (*pfnClientUninitialize)(void);
    879 
    880         void  (*pfnComInitialize)(const char *pszVirtualBoxIID,
    881                                   IVirtualBox **ppVirtualBox,
    882                                   const char *pszSessionIID,
    883                                   ISession **ppSession);
    884 
    885         void  (*pfnComUninitialize)(void);
    886 
    887         void  (*pfnComUnallocMem)(void *pv);
    888 
    889         int   (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
    890         int   (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
    891         void  (*pfnUtf8Free)(char *pszString);
    892         void  (*pfnUtf16Free)(BSTR pwszString);
    893 
    894 #ifdef VBOX_WITH_XPCOM
    895         void  (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
    896 #endif /* VBOX_WITH_XPCOM */
    897         HRESULT (*pfnGetException)(IErrorInfo **ppException);
    898         HRESULT (*pfnClearException)(void);
     868        void (*pfnComInitialize)(const char *pszVirtualBoxIID,
     869                                 IVirtualBox **ppVirtualBox,
     870                                 const char *pszSessionIID,
     871                                 ISession **ppSession);
     872
     873        void (*pfnComUninitialize)(void);
     874
     875        void (*pfnComUnallocMem)(void *pv);
     876        void (*pfnUtf16Free)(BSTR pwszString);
     877        void (*pfnUtf8Free)(char *pszString);
     878
     879        int (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
     880        int (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
     881
     882#ifdef VBOX_WITH_XPCOM
     883        void (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
     884#endif /* VBOX_WITH_XPCOM */
    899885
    900886        /** Tail version, same as uVersion. */
    901887        unsigned uEndVersion;
    902     } s_Functions_v3_0 =
    903     {
    904         sizeof(s_Functions_v3_0),
    905         0x00030000U,
     888    } s_Functions_v2_0 =
     889    {
     890        sizeof(s_Functions_v2_0),
     891        0x00020000U,
    906892
    907893        VBoxVersion,
    908         VBoxAPIVersion,
    909 
    910         VBoxClientInitialize,
    911         VBoxClientUninitialize,
    912894
    913895        VBoxComInitialize,
     
    915897
    916898        VBoxComUnallocMem,
     899        VBoxUtf16Free,
     900        VBoxUtf8Free,
    917901
    918902        VBoxUtf16ToUtf8,
    919903        VBoxUtf8ToUtf16,
    920         VBoxUtf8Free,
    921         VBoxUtf16Free,
    922904
    923905#ifdef VBOX_WITH_XPCOM
    924906        VBoxGetEventQueue,
    925907#endif /* VBOX_WITH_XPCOM */
    926         VBoxGetException,
    927         VBoxClearException,
    928 
    929         0x00030000U
     908
     909        0x00020000U
    930910    };
    931911
    932     if ((uVersion & 0xffff0000U) == 0x00030000U)
    933         return (PCVBOXCAPI)&s_Functions_v3_0;
     912    if ((uVersion & 0xffff0000U) == 0x00020000U)
     913        return (PCVBOXCAPI)&s_Functions_v2_0;
    934914
    935915    /*
    936      * Legacy interface version 2.0.
     916     * Legacy interface version 1.0.
    937917     */
    938     static const struct VBOXCAPIV2
     918    static const struct VBOXCAPIV1
    939919    {
    940920        /** The size of the structure. */
     
    945925        unsigned int (*pfnGetVersion)(void);
    946926
    947         void  (*pfnComInitialize)(const char *pszVirtualBoxIID,
    948                                   IVirtualBox **ppVirtualBox,
    949                                   const char *pszSessionIID,
    950                                   ISession **ppSession);
    951 
    952         void  (*pfnComUninitialize)(void);
    953 
    954         void  (*pfnComUnallocMem)(void *pv);
    955         void  (*pfnUtf16Free)(BSTR pwszString);
    956         void  (*pfnUtf8Free)(char *pszString);
    957 
    958         int   (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
    959         int   (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
    960 
    961 #ifdef VBOX_WITH_XPCOM
    962         void  (*pfnGetEventQueue)(nsIEventQueue **ppEventQueue);
    963 #endif /* VBOX_WITH_XPCOM */
    964 
    965         /** Tail version, same as uVersion. */
    966         unsigned uEndVersion;
    967     } s_Functions_v2_0 =
    968     {
    969         sizeof(s_Functions_v2_0),
    970         0x00020000U,
    971 
    972         VBoxVersion,
    973 
    974         VBoxComInitialize,
    975         VBoxComUninitialize,
    976 
    977         VBoxComUnallocMem,
    978         VBoxUtf16Free,
    979         VBoxUtf8Free,
    980 
    981         VBoxUtf16ToUtf8,
    982         VBoxUtf8ToUtf16,
    983 
    984 #ifdef VBOX_WITH_XPCOM
    985         VBoxGetEventQueue,
    986 #endif /* VBOX_WITH_XPCOM */
    987 
    988         0x00020000U
    989     };
    990 
    991     if ((uVersion & 0xffff0000U) == 0x00020000U)
    992         return (PCVBOXCAPI)&s_Functions_v2_0;
    993 
    994     /*
    995      * Legacy interface version 1.0.
    996      */
    997     static const struct VBOXCAPIV1
    998     {
    999         /** The size of the structure. */
    1000         unsigned cb;
    1001         /** The structure version. */
    1002         unsigned uVersion;
    1003 
    1004         unsigned int (*pfnGetVersion)(void);
    1005 
    1006         void  (*pfnComInitialize)(IVirtualBox **virtualBox, ISession **session);
    1007         void  (*pfnComUninitialize)(void);
    1008 
    1009         void  (*pfnComUnallocMem)(void *pv);
    1010         void  (*pfnUtf16Free)(BSTR pwszString);
    1011         void  (*pfnUtf8Free)(char *pszString);
    1012 
    1013         int   (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
    1014         int   (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
     927        void (*pfnComInitialize)(IVirtualBox **virtualBox, ISession **session);
     928        void (*pfnComUninitialize)(void);
     929
     930        void (*pfnComUnallocMem)(void *pv);
     931        void (*pfnUtf16Free)(BSTR pwszString);
     932        void (*pfnUtf8Free)(char *pszString);
     933
     934        int (*pfnUtf16ToUtf8)(CBSTR pwszString, char **ppszString);
     935        int (*pfnUtf8ToUtf16)(const char *pszString, BSTR *ppwszString);
    1015936
    1016937        /** Tail version, same as uVersion. */
  • trunk/src/VBox/Main/cbinding/VBoxCAPIGlue.c

    r52846 r54027  
    55
    66/*
    7  * Copyright (C) 2008-2014 Oracle Corporation
     7 * Copyright (C) 2008-2015 Oracle Corporation
    88 *
    99 * Permission is hereby granted, free of charge, to any person
     
    164164#ifndef WIN32
    165165    g_hVBoxCAPI = dlopen(szName, RTLD_NOW | RTLD_LOCAL);
     166#else /* WIN32 */
     167    g_hVBoxCAPI = LoadLibraryExA(szName, NULL /* hFile */, 0 /* dwFlags */);
     168#endif /* WIN32 */
    166169    if (g_hVBoxCAPI)
    167170    {
    168171        PFNVBOXGETCAPIFUNCTIONS pfnGetFunctions;
     172#ifndef WIN32
    169173        pfnGetFunctions = (PFNVBOXGETCAPIFUNCTIONS)(uintptr_t)
    170174            dlsym(g_hVBoxCAPI, VBOX_GET_CAPI_FUNCTIONS_SYMBOL_NAME);
    171 #ifdef VBOX_GET_XPCOM_FUNCTIONS_SYMBOL_NAME
     175# ifdef VBOX_GET_XPCOM_FUNCTIONS_SYMBOL_NAME
    172176        if (!pfnGetFunctions)
    173177            pfnGetFunctions = (PFNVBOXGETCAPIFUNCTIONS)(uintptr_t)
    174178                dlsym(g_hVBoxCAPI, VBOX_GET_XPCOM_FUNCTIONS_SYMBOL_NAME);
    175 #endif /* VBOX_GET_XPCOM_FUNCTIONS_SYMBOL_NAME */
     179# endif /* VBOX_GET_XPCOM_FUNCTIONS_SYMBOL_NAME */
     180#else /* WIN32 */
     181        pfnGetFunctions = (PFNVBOXGETCAPIFUNCTIONS)
     182            GetProcAddress(g_hVBoxCAPI, VBOX_GET_CAPI_FUNCTIONS_SYMBOL_NAME);
     183#endif /* WIN32 */
    176184        if (pfnGetFunctions)
    177185        {
     
    179187            if (g_pVBoxFuncs)
    180188            {
    181                 g_pfnGetFunctions = pfnGetFunctions;
    182                 return 0;
     189                if (   (   VBOX_CAPI_MAJOR(g_pVBoxFuncs->uVersion)
     190                        == VBOX_CAPI_MAJOR(VBOX_CAPI_VERSION))
     191                    && (   VBOX_CAPI_MINOR(g_pVBoxFuncs->uVersion)
     192                        >= VBOX_CAPI_MINOR(VBOX_CAPI_VERSION)))
     193                {
     194                    g_pfnGetFunctions = pfnGetFunctions;
     195                    return 0;
     196                }
     197                setErrMsg(1, "%.80s: pfnGetFunctions(%#x) returned incompatible version %#x",
     198                          szName, VBOX_CAPI_VERSION, g_pVBoxFuncs->uVersion);
     199                g_pVBoxFuncs = NULL;
    183200            }
    184 
    185             /* bail out */
    186             setErrMsg(1, "%.80s: pfnGetFunctions(%#x) failed",
    187                       szName, VBOX_CAPI_VERSION);
     201            else
     202            {
     203                /* bail out */
     204                setErrMsg(1, "%.80s: pfnGetFunctions(%#x) failed",
     205                          szName, VBOX_CAPI_VERSION);
     206            }
    188207        }
    189208        else
     209        {
     210#ifndef WIN32
    190211            setErrMsg(1, "dlsym(%.80s/%.32s): %.128s",
    191212                      szName, VBOX_GET_CAPI_FUNCTIONS_SYMBOL_NAME, dlerror());
    192         dlclose(g_hVBoxCAPI);
    193         g_hVBoxCAPI = NULL;
    194     }
    195     else
    196         setErrMsg(0, "dlopen(%.80s): %.160s", szName, dlerror());
    197 #else /* !WIN32 */
    198     g_hVBoxCAPI = LoadLibraryExA(szName, NULL /* hFile */, 0 /* dwFlags */);
    199     if (g_hVBoxCAPI)
    200     {
    201         PFNVBOXGETCAPIFUNCTIONS pfnGetFunctions;
    202         pfnGetFunctions = (PFNVBOXGETCAPIFUNCTIONS)
    203             GetProcAddress(g_hVBoxCAPI, VBOX_GET_CAPI_FUNCTIONS_SYMBOL_NAME);
    204         if (pfnGetFunctions)
    205         {
    206             g_pVBoxFuncs = pfnGetFunctions(VBOX_CAPI_VERSION);
    207             if (g_pVBoxFuncs)
    208             {
    209                 g_pfnGetFunctions = pfnGetFunctions;
    210                 return 0;
    211             }
    212 
    213             /* bail out */
    214             setErrMsg(1, "%.80s: pfnGetFunctions(%#x) failed",
    215                       szName, VBOX_CAPI_VERSION);
    216         }
    217         else
     213#else /* WIN32 */
    218214            setErrMsg(1, "GetProcAddress(%.80s/%.32s): %d",
    219215                      szName, VBOX_GET_CAPI_FUNCTIONS_SYMBOL_NAME, GetLastError());
     216#endif /* WIN32 */
     217        }
     218
     219#ifndef WIN32
     220        dlclose(g_hVBoxCAPI);
     221#else /* WIN32 */
    220222        FreeLibrary(g_hVBoxCAPI);
     223#endif /* WIN32 */
    221224        g_hVBoxCAPI = NULL;
    222225    }
    223226    else
     227    {
     228#ifndef WIN32
     229        setErrMsg(0, "dlopen(%.80s): %.160s", szName, dlerror());
     230#else /* WIN32 */
    224231        setErrMsg(0, "LoadLibraryEx(%.80s): %d", szName, GetLastError());
    225 #endif /* !WIN32 */
     232#endif /* WIN32 */
     233    }
    226234
    227235    return -1;
  • trunk/src/VBox/Main/cbinding/capiidl.xsl

    r53938 r54027  
    14831483    int (*pfnInterruptEventQueueProcessing)(void);
    14841484
    1485     /** Tail version, same as uVersion. */
     1485    /**
     1486     * Clear memory used by a UTF-8 string. Must be zero terminated.
     1487     * Can be used for any UTF-8 or ASCII/ANSI string.
     1488     *
     1489     * @param pszString     input/output string
     1490     */
     1491    void (*pfnUtf8Clear)(char *pszString);
     1492    /**
     1493     * Clear memory used by a UTF-16 string. Must be zero terminated.
     1494     * Can be used for any UTF-16 or UCS-2 string.
     1495     *
     1496     * @param pwszString    input/output string
     1497     */
     1498     void (*pfnUtf16Clear)(BSTR pwszString);
     1499
     1500    /** Tail version, same as uVersion.
     1501     *
     1502     * This should only be accessed if for some reason an API client needs
     1503     * exactly the version it requested, or if cb is used to calculate the
     1504     * address of this field. It may move as the structure before this is
     1505     * allowed to grow as long as all the data from earlier minor versions
     1506     * remains at the same place.
     1507     */
    14861508    unsigned uEndVersion;
    14871509} VBOXCAPI;
     
    15001522#endif /* !WIN32 */
    15011523
     1524/** Extract the C API style major version.
     1525 * Useful for comparing the interface version in VBOXCAPI::uVersion. */
     1526#define VBOX_CAPI_MAJOR(x) (((x) & 0xffff0000U) >> 16)
     1527
     1528/** Extract the C API style major version.
     1529 * Useful for comparing the interface version in VBOXCAPI::uVersion. */
     1530#define VBOX_CAPI_MINOR(x) ((x) & 0x0000ffffU)
     1531
    15021532/** The current interface version.
    15031533 * For use with VBoxGetCAPIFunctions and to be found in VBOXCAPI::uVersion. */
    1504 #define VBOX_CAPI_VERSION 0x00040000U
     1534#define VBOX_CAPI_VERSION 0x00040001U
    15051535
    15061536#ifndef WIN32
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