VirtualBox

Changeset 26660 in vbox for trunk/src/VBox/Runtime/r3


Ignore:
Timestamp:
Feb 19, 2010 2:49:54 PM (15 years ago)
Author:
vboxsync
Message:

RTSystemQueryDmiString-solaris.cpp: Overflow hanlding. Don't query data we don't need because it might be privileged and cause failures when getting bits we have access to. Don't use VERR_OPEN_FAILED since we only want VERR_NOT_SUPPORTED or VERR_ACCESS_DENIED (unless something spectacularly interesting happend).

File:
1 edited

Legend:

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

    r26626 r26660  
    4242#include <smbios.h>
    4343
     44
    4445RTDECL(int) RTSystemQueryDmiString(RTSYSDMISTR enmString, char *pszBuf, size_t cbBuf)
    4546{
     
    4950    AssertReturn(enmString > RTSYSDMISTR_INVALID && enmString < RTSYSDMISTR_END, VERR_INVALID_PARAMETER);
    5051
    51     int rc = VINF_SUCCESS;
     52    int rc = VERR_NOT_SUPPORTED;
    5253    int err = 0;
    5354    smbios_hdl_t *pSMB = smbios_open(NULL /* default fd */, SMB_VERSION, 0 /* flags */, &err);
    5455    if (pSMB)
    5556    {
    56         smbios_system_t hSMBSys;
    57         id_t hSMBId = smbios_info_system(pSMB, &hSMBSys);
    58         if (hSMBId != SMB_ERR)
     57        if (enmString == RTSYSDMISTR_PRODUCT_UUID)
     58        {
     59            smbios_system_t hSMBSys;
     60            id_t hSMBId = smbios_info_system(pSMB, &hSMBSys);
     61            if (hSMBId != SMB_ERR)
     62            {
     63                static char const s_szHex[17] = "0123456789ABCDEF";
     64                char     szData[64];
     65                char    *pszData = szData;
     66                unsigned cchUuid = RT_MIN(hSMBSys.smbs_uuidlen, sizeof(szData) - 1);
     67                for (unsigned i = 0; i < cchUuid; i++)
     68                {
     69                    *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] >> 4];
     70                    *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] & 0xf];
     71                    if (i == 3 || i == 5 || i == 7 || i == 9)
     72                        *pszData++ = '-';
     73                }
     74                *pszData = '\0';
     75                rc = RTStrCopy(pszBuf, cbBuf, szData);
     76                smbios_close(pSMB);
     77                return rc;
     78            }
     79        }
     80        else
    5981        {
    6082            smbios_info_t hSMBInfo;
     
    6486                switch (enmString)
    6587                {
    66                     case RTSYSDMISTR_PRODUCT_UUID:
    67                     {
    68                         static char const s_szHex[17] = "0123456789ABCDEF";
    69                         char szData[64];
    70                         char *pszData = szData;
    71                         for (unsigned i = 0; i < RT_MIN(hSMBSys.smbs_uuidlen, sizeof(szData) - 1); i++)
    72                         {
    73                             *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] >> 4];
    74                             *pszData++ = s_szHex[hSMBSys.smbs_uuid[i] & 0xf];
    75                             if (i == 3 || i == 5 || i == 7 || i == 9)
    76                                 *pszData++ = '-';
    77                         }
    78                         *pszData = '\0';
    79                         RTStrPrintf(pszBuf, cbBuf, "%s", szData);
    80                         rc = VINF_SUCCESS;
    81                         break;
    82                     }
     88                    case RTSYSDMISTR_PRODUCT_NAME:      rc = RTStrCopy(pszBuf, cbBuf, hSMBInfo.smbi_product); break;
     89                    case RTSYSDMISTR_PRODUCT_VERSION:   rc = RTStrCopy(pszBuf, cbBuf, hSMBInfo.smbi_version); break;
     90                    case RTSYSDMISTR_PRODUCT_SERIAL:    rc = RTStrCopy(pszBuf, cbBuf, hSMBInfo.smbi_serial);  break;
    8391
    84                     case RTSYSDMISTR_PRODUCT_NAME:      RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_product); rc = VINF_SUCCESS; break;
    85                     case RTSYSDMISTR_PRODUCT_VERSION:   RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_version); rc = VINF_SUCCESS; break;
    86                     case RTSYSDMISTR_PRODUCT_SERIAL:    RTStrPrintf(pszBuf, cbBuf, "%s", hSMBInfo.smbi_serial);  rc = VINF_SUCCESS; break;
    87 
    88                     default:
     92                    default:  /* make gcc happy */
    8993                        rc = VERR_NOT_SUPPORTED;
    9094                }
     95                smbios_close(pSMB);
     96                return rc;
    9197            }
    92             else
    93                 rc = VERR_INTERNAL_ERROR_2;
    9498        }
    95         else
    96             rc = VERR_INTERNAL_ERROR;
    9799
     100        /* smbios_* error path. */
     101        err = smbios_errno(pSMB);
    98102        smbios_close(pSMB);
    99103    }
    100     else
    101         rc = VERR_OPEN_FAILED;
    102104
     105    /* Do some error conversion.  */
     106    if (err == EPERM || err == EACCES)
     107        rc = VERR_ACCESS_DENIED;
    103108    return rc;
    104109}
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