VirtualBox

Changeset 37141 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
May 18, 2011 3:14:59 PM (14 years ago)
Author:
vboxsync
Message:

VBoxGuestR3LibAdditions.cpp: r=bird: Added todo about leaks and misbeavior of VbglR3GetAdditionsVersion on windows, fixed it in the x-platform code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibAdditions.cpp

    r37019 r37141  
    3737
    3838/**
    39  * Fallback for vbglR3GetAdditionsVersion.
     39 * Fallback for VbglR3GetAdditionsVersion.
    4040 */
    4141static int vbglR3GetAdditionsCompileTimeVersion(char **ppszVer, char **ppszVerEx, char **ppszRev)
    4242{
    43     /* Raw version string: major.minor.build. */
     43    int rc = VINF_SUCCESS;
    4444    if (ppszVer)
    45     {
    46         *ppszVer = RTStrDup(VBOX_VERSION_STRING_RAW);
    47         if (!*ppszVer)
    48             return VERR_NO_STR_MEMORY;
    49     }
    50 
    51     /* Extended version string: major.minor.build (+ vendor [suffix(es)]). */
    52     if (ppszVerEx)
    53     {
    54         *ppszVerEx = RTStrDup(VBOX_VERSION_STRING);
    55         if (!*ppszVerEx)
    56             return VERR_NO_STR_MEMORY;
    57     }
    58 
    59     if (ppszRev)
    60     {
    61         char szRev[64];
    62         RTStrPrintf(szRev, sizeof(szRev), "%d", VBOX_SVN_REV);
    63         *ppszRev = RTStrDup(szRev);
    64         if (!*ppszRev)
    65         {
    66             if (ppszVer)
    67             {
    68                 RTStrFree(*ppszVer);
    69                 *ppszVer = NULL;
    70             }
    71             return VERR_NO_STR_MEMORY;
    72         }
    73     }
    74 
    75     return VINF_SUCCESS;
     45        rc = RTStrDupEx(ppszVer, VBOX_VERSION_STRING_RAW);
     46    if (RT_SUCCESS(rc))
     47    {
     48        if (ppszVerEx)
     49            rc = RTStrDupEx(ppszVerEx, VBOX_VERSION_STRING);
     50        if (RT_SUCCESS(rc))
     51        {
     52            if (ppszRev)
     53            {
     54#if 0
     55                char szRev[64];
     56                RTStrPrintf(szRev, sizeof(szRev), "%d", VBOX_SVN_REV);
     57                rc = RTStrDupEx(ppszRev, szRev);
     58#else
     59                rc = RTStrDupEx(ppszRev, RT_XSTR(VBOX_SVN_REV));
     60#endif
     61            }
     62            if (RT_SUCCESS(rc))
     63                return VINF_SUCCESS;
     64
     65            /* bail out: */
     66        }
     67        if (ppszVerEx)
     68        {
     69            RTStrFree(*ppszVerEx);
     70            *ppszVerEx = NULL;
     71        }
     72    }
     73    if (ppszVer)
     74    {
     75        RTStrFree(*ppszVer);
     76        *ppszVer = NULL;
     77    }
     78    return rc;
    7679}
    7780
    7881#ifdef RT_OS_WINDOWS
     82
    7983/**
    8084 * Looks up the storage path handle (registry).
     
    8589 *                      vbglR3CloseAdditionsWinStoragePath().
    8690 */
    87 static int vbglR3GetAdditionsWinStoragePath(PHKEY phKey)
     91static int vbglR3QueryAdditionsWinStoragePath(PHKEY phKey)
    8892{
    8993    /*
     
    139143 * @returns IPRT status value
    140144 * @param   hKey        Handle to close, retrieved by
    141  *                      vbglR3GetAdditionsWinStoragePath().
     145 *                      vbglR3QueryAdditionsWinStoragePath().
    142146 */
    143147static int vbglR3CloseAdditionsWinStoragePath(HKEY hKey)
     
    173177    return rc;
    174178}
     179
    175180
    176181/**
     
    191196VBGLR3DECL(int) VbglR3GetAdditionsVersion(char **ppszVer, char **ppszVerEx, char **ppszRev)
    192197{
     198    /*
     199     * Zap the return value up front.
     200     */
     201    if (ppszVer)
     202        *ppszVer   = NULL;
     203    if (ppszVerEx)
     204        *ppszVerEx = NULL;
     205    if (ppszRev)
     206        *ppszRev   = NULL;
     207
     208
    193209#ifdef RT_OS_WINDOWS
    194210    HKEY hKey;
    195     int rc = vbglR3GetAdditionsWinStoragePath(&hKey);
     211    int rc = vbglR3QueryAdditionsWinStoragePath(&hKey);
    196212    if (RT_SUCCESS(rc))
    197213    {
    198         /* Version. */
     214        /*
     215         * Version.
     216         */
     217        /** @todo r=bird: This code has broken error handling: 1. Errors are
     218         *        overwritten and hidden, leaving return values undefined.
     219         *        2. On error, memory could be leaked.
     220         *  Also, just use a static 32-byte buffer instead of allocating
     221         *  three!  In fact, why not just factor out the string value query? */
    199222        LONG l;
    200223        DWORD dwType;
     
    246269                rc = VERR_NO_MEMORY;
    247270        }
    248         /* Revision. */
     271
     272        /*
     273         * Revision.
     274         */
    249275        if (ppszRev)
    250276        {
     
    310336#ifdef RT_OS_WINDOWS
    311337    HKEY hKey;
    312     rc = vbglR3GetAdditionsWinStoragePath(&hKey);
     338    rc = vbglR3QueryAdditionsWinStoragePath(&hKey);
    313339    if (RT_SUCCESS(rc))
    314340    {
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