VirtualBox

Changeset 26843 in vbox


Ignore:
Timestamp:
Feb 26, 2010 12:59:51 PM (15 years ago)
Author:
vboxsync
Message:

RTSystemQueryDmiString-darwin.cpp: fixed leaks and buffer overflow handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/darwin/RTSystemQueryDmiString-darwin.cpp

    r26821 r26843  
    3636#include "internal/iprt.h"
    3737
     38#include <iprt/assert.h>
    3839#include <iprt/err.h>
    39 #include <iprt/assert.h>
     40#include <iprt/mem.h>
    4041#include <iprt/string.h>
    4142
     
    4344#include <IOKit/IOKitLib.h>
    4445
     46
     47/*******************************************************************************
     48*   Defined Constants And Macros                                               *
     49*******************************************************************************/
    4550#define IOCLASS_PLATFORMEXPERTDEVICE         "IOPlatformExpertDevice"
    4651#define PROP_PRODUCT_NAME                    "product-name"
     
    4853#define PROP_PRODUCT_SERIAL                  "IOPlatformSerialNumber"
    4954#define PROP_PRODUCT_UUID                    "IOPlatformUUID"
     55
    5056
    5157RTDECL(int) RTSystemQueryDmiString(RTSYSDMISTR enmString, char *pszBuf, size_t cbBuf)
     
    8086        return VERR_NOT_SUPPORTED;
    8187
     88    /* IOServiceGetMatchingServices will always consume ClassToMatch. */
    8289    io_iterator_t Iterator;
    8390    kr = IOServiceGetMatchingServices(MasterPort, ClassToMatch, &Iterator);
     
    9299            || enmString == RTSYSDMISTR_PRODUCT_VERSION)
    93100        {
    94             CFDataRef DataRef = (CFDataRef)IORegistryEntryCreateCFProperty(ServiceObject, PropStringRef, kCFAllocatorDefault, kNilOptions);
     101            CFDataRef DataRef = (CFDataRef)IORegistryEntryCreateCFProperty(ServiceObject, PropStringRef,
     102                                                                           kCFAllocatorDefault, kNilOptions);
    95103            if (DataRef)
    96104            {
    97                 size_t cbData = CFDataGetLength(DataRef);
    98                 const uint8_t *pu8Data = CFDataGetBytePtr(DataRef);
    99                 memcpy(pszBuf, pu8Data, RT_MIN(cbData, cbBuf));
    100                 pszBuf[RT_MIN(cbData + 1, cbBuf)] = '\0';
    101                 rc = VINF_SUCCESS;
     105                size_t         cbData  = CFDataGetLength(DataRef);
     106                const char    *pchData = (const char *)CFDataGetBytePtr(DataRef);
     107                rc = RTStrCopyEx(pszBuf, cbBuf, pchData, cbData);
     108                CFRelease(DataRef);
    102109                break;
    103110            }
     
    105112        else
    106113        {
    107             CFStringRef StringRef = (CFStringRef)IORegistryEntryCreateCFProperty(ServiceObject, PropStringRef, kCFAllocatorDefault, kNilOptions);
     114            CFStringRef StringRef = (CFStringRef)IORegistryEntryCreateCFProperty(ServiceObject, PropStringRef,
     115                                                                                 kCFAllocatorDefault, kNilOptions);
    108116            if (StringRef)
    109117            {
    110                 Boolean res = CFStringGetCString(StringRef, pszBuf, cbBuf, kCFStringEncodingASCII);
    111                 rc = res == TRUE ? VINF_SUCCESS : VERR_NOT_SUPPORTED;
     118                Boolean fRc = CFStringGetCString(StringRef, pszBuf, cbBuf, kCFStringEncodingUTF8);
     119                if (fRc)
     120                    rc = VINF_SUCCESS;
     121                else
     122                {
     123                    CFIndex cwc    = CFStringGetLength(StringRef);
     124                    size_t  cbTmp  = cwc + 1;
     125                    char   *pszTmp = (char *)RTMemTmpAlloc(cbTmp);
     126                    int     cTries = 1;
     127                    while (   pszTmp
     128                           && (fRc = CFStringGetCString(StringRef, pszTmp, cbTmp, kCFStringEncodingUTF8)) == FALSE
     129                           && cTries++ < 4)
     130                    {
     131                        RTMemTmpFree(pszTmp);
     132                        cbTmp *= 2;
     133                        pszTmp = (char *)RTMemTmpAlloc(cbTmp);
     134                    }
     135                    if (fRc)
     136                        rc = RTStrCopy(pszBuf, cbBuf, pszTmp);
     137                    else if (!pszTmp)
     138                        rc = VERR_NO_TMP_MEMORY;
     139                    else
     140                        rc = VERR_ACCESS_DENIED;
     141                    RTMemFree(pszTmp);
     142                }
     143                CFRelease(StringRef);
    112144                break;
    113145            }
     
    119151    return rc;
    120152}
     153
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