VirtualBox

Changeset 70222 in vbox for trunk/include/VBox


Ignore:
Timestamp:
Dec 19, 2017 2:01:21 PM (7 years ago)
Author:
vboxsync
Message:

GuestPropertySvc.h: Use memcpy instead of strcpy as the latter is frowned upon by recent darwin and others.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/GuestPropertySvc.h

    r70221 r70222  
    6565 * Get the name of a flag as a string.
    6666 * @returns the name, or NULL if fFlag is invalid.
    67  * @param   fFlag  the flag.  Must be a value from the ePropFlags enumeration
    68  *                 list.
    69  */
    70 DECLINLINE(const char *) GuestPropFlagName(uint32_t fFlag)
     67 * @param   fFlag       The flag, GUEST_PROP_F_XXX.
     68 * @param   pcchName    Where to return the name length.
     69 */
     70DECLINLINE(const char *) GuestPropFlagNameAndLen(uint32_t fFlag, size_t *pcchName)
    7171{
    7272    switch (fFlag)
    7373    {
    7474        case GUEST_PROP_F_TRANSIENT:
     75            *pcchName = sizeof("TRANSIENT") - 1;
    7576            return "TRANSIENT";
    7677        case GUEST_PROP_F_RDONLYGUEST:
     78            *pcchName = sizeof("RDONLYGUEST") - 1;
    7779            return "RDONLYGUEST";
    7880        case GUEST_PROP_F_RDONLYHOST:
     81            *pcchName = sizeof("RDONLYHOST") - 1;
    7982            return "RDONLYHOST";
    8083        case GUEST_PROP_F_READONLY:
     84            *pcchName = sizeof("READONLY") - 1;
    8185            return "READONLY";
    8286        case GUEST_PROP_F_TRANSRESET:
     87            *pcchName = sizeof("TRANSRESET") - 1;
    8388            return "TRANSRESET";
    8489        default:
    85             break;
     90            *pcchName = 0;
     91            return NULL;
    8692    }
    87     return NULL;
    88 }
    89 
    90 /**
    91  * Get the length of a flag name as returned by flagName.
    92  * @returns the length, or 0 if fFlag is invalid.
    93  * @param   fFlag  the flag.  Must be a value from the ePropFlags enumeration
    94  *                 list.
    95  */
    96 DECLINLINE(size_t) GuestPropFlagNameLen(uint32_t fFlag)
    97 {
    98     const char *pcszName = GuestPropFlagName(fFlag);
    99     return RT_LIKELY(pcszName != NULL) ? strlen(pcszName) : 0;
    10093}
    10194
     
    131124    if (pcszFlags)
    132125    {
    133         while (' ' == *pcszNext)
     126        while (*pcszNext == ' ')
    134127            ++pcszNext;
    135128        while ((*pcszNext != '\0') && RT_SUCCESS(rc))
    136129        {
    137             unsigned i = 0;
    138             for (; i < RT_ELEMENTS(s_aFlagList); ++i)
    139                 if (RTStrNICmp(pcszNext, GuestPropFlagName(s_aFlagList[i]), GuestPropFlagNameLen(s_aFlagList[i])) == 0)
     130            unsigned i;
     131            rc = VERR_PARSE_ERROR;
     132            for (i = 0; i < RT_ELEMENTS(s_aFlagList); ++i)
     133            {
     134                size_t      cchFlagName;
     135                const char *pszFlagName = GuestPropFlagNameAndLen(s_aFlagList[i], &cchFlagName);
     136                if (RTStrNICmp(pcszNext, pszFlagName, cchFlagName) == 0)
     137                {
     138                    char ch;
     139                    fFlags |= s_aFlagList[i];
     140                    pcszNext += cchFlagName;
     141                    while ((ch = *pcszNext) == ' ')
     142                        ++pcszNext;
     143                    rc = VINF_SUCCESS;
     144                    if (ch == ',')
     145                    {
     146                        ++pcszNext;
     147                        while (*pcszNext == ' ')
     148                            ++pcszNext;
     149                    }
     150                    else if (ch != '\0')
     151                        rc = VERR_PARSE_ERROR;
    140152                    break;
    141             if (RT_ELEMENTS(s_aFlagList) == i)
    142                 rc = VERR_PARSE_ERROR;
    143             else
    144             {
    145                 fFlags |= s_aFlagList[i];
    146                 pcszNext += GuestPropFlagNameLen(s_aFlagList[i]);
    147                 while (' ' == *pcszNext)
    148                     ++pcszNext;
    149                 if (',' == *pcszNext)
    150                     ++pcszNext;
    151                 else if (*pcszNext != '\0')
    152                     rc = VERR_PARSE_ERROR;
    153                 while (' ' == *pcszNext)
    154                     ++pcszNext;
     153                }
    155154            }
    156155        }
     
    167166 * @param    fFlags    the flags to write out
    168167 * @param    pszFlags  where to write the flags string.  This must point to
    169  *                     a buffer of size (at least) MAX_FLAGS_LEN.
     168 *                     a buffer of size (at least) GUEST_PROP_MAX_FLAGS_LEN.
    170169 */
    171170DECLINLINE(int) GuestPropWriteFlags(uint32_t fFlags, char *pszFlags)
     
    194193            if (s_aFlagList[i] == (fFlags & s_aFlagList[i]))
    195194            {
    196                 strcpy(pszNext, GuestPropFlagName(s_aFlagList[i]));
    197                 pszNext += GuestPropFlagNameLen(s_aFlagList[i]);
     195                size_t      cchFlagName;
     196                const char *pszFlagName = GuestPropFlagNameAndLen(s_aFlagList[i], &cchFlagName);
     197                memcpy(pszNext, pszFlagName, cchFlagName);
     198                pszNext += cchFlagName;
    198199                fFlags &= ~s_aFlagList[i];
    199200                if (fFlags != GUEST_PROP_F_NILFLAG)
    200201                {
    201                     strcpy(pszNext, ", ");
    202                     pszNext += 2;
     202                    *pszNext++ = ',';
     203                    *pszNext++ = ' ';
    203204                }
    204205            }
     
    206207        *pszNext = '\0';
    207208
     209        Assert((uintptr_t)(pszNext - pszFlags) < GUEST_PROP_MAX_FLAGS_LEN);
    208210        Assert(fFlags == GUEST_PROP_F_NILFLAG); /* bad s_aFlagList */
    209211    }
     
    353355     * The property flags (IN pointer)
    354356     * This is a comma-separated list of the format flag=value
    355      * The length must be less than or equal to MAX_FLAGS_LEN and only
     357     * The length must be less than or equal to GUEST_PROP_MAX_FLAGS_LEN and only
    356358     * known flag names and values will be accepted.
    357359     */
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