VirtualBox

Changeset 102667 in vbox for trunk


Ignore:
Timestamp:
Dec 21, 2023 9:20:02 AM (9 months ago)
Author:
vboxsync
Message:

Guest Control: Actually add the found strings of GuestWaitEventPayload::ToStringVector() to the output vector. Enhanced docs, added testcases to tstGuestCtrlParseBuffer. bugref:10415

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h

    r102654 r102667  
    12141214     * Returns the payload as a vector of strings, validated.
    12151215     *
     1216     * The payload data must contain the strings separated by a string zero terminator each,
     1217     * ending with a separate zero terminator. Incomplete data will considered as invalid data.
     1218     *
     1219     * Example: 'foo\0bar\0baz\0\0'.
     1220     *
    12161221     * @returns VBox status code.
    12171222     * @param   vecStrings      Where to return the vector of strings on success.
     
    12241229
    12251230        const char *psz = (const char *)pvData;
    1226         AssertPtrReturn(psz, vrc = VERR_INVALID_PARAMETER);
    1227         size_t      cb  = cbData;
    1228         while (cb)
    1229         {
    1230             size_t const cch = strlen(psz);
    1231             if (!cch)
    1232                 break;
    1233             size_t const cbStr = cch + 1 /* String terminator */;
    1234             vrc = RTStrValidateEncodingEx(psz, cbStr,
    1235                                           RTSTR_VALIDATE_ENCODING_ZERO_TERMINATED | RTSTR_VALIDATE_ENCODING_EXACT_LENGTH);
    1236             if (RT_FAILURE(vrc))
    1237                 break;
    1238             AssertBreakStmt(cb >= cbStr, vrc = VERR_INVALID_PARAMETER);
    1239             cb  -= cbStr;
    1240             psz += cbStr;
     1231        if (psz)
     1232        {
     1233            size_t cb  = cbData;
     1234            while (cb)
     1235            {
     1236                size_t const cch = strnlen(psz, cb);
     1237                if (!cch)
     1238                    break;
     1239                size_t const cbStr = RT_MIN(cb, cch + 1 /* String terminator */);
     1240                vrc = RTStrValidateEncodingEx(psz, cbStr,
     1241                                              RTSTR_VALIDATE_ENCODING_ZERO_TERMINATED | RTSTR_VALIDATE_ENCODING_EXACT_LENGTH);
     1242                if (RT_FAILURE(vrc))
     1243                    break;
     1244                try
     1245                {
     1246                    vecStrings.push_back(Utf8Str(psz, cch));
     1247                }
     1248                catch (std::bad_alloc &)
     1249                {
     1250                    AssertFailedBreakStmt(vrc = VERR_NO_MEMORY);
     1251                }
     1252                AssertBreakStmt(cb >= cbStr, vrc = VERR_INVALID_PARAMETER);
     1253                cb  -= cbStr;
     1254                psz += cbStr;
     1255            }
     1256
     1257            if (RT_SUCCESS(vrc))
     1258                AssertStmt(cb <= 1 /* Ending terminator */, vrc = VERR_INVALID_PARAMETER);
    12411259        }
    1242 
    1243         if (RT_SUCCESS(vrc))
    1244             AssertStmt(cb <= 1 /* Ending terminator */, vrc = VERR_INVALID_PARAMETER);
    12451260        return vrc;
    12461261    }
  • trunk/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp

    r99640 r102667  
    195195
    196196/**
     197 * Tests payload data to string vector parsing.
     198 */
     199static struct
     200{
     201    /** Payload data to test. */
     202    const char *pbData;
     203    /** Size (in bytes) of \b pbData. */
     204    size_t      cbData;
     205    /** Number of extracted strings. */
     206    size_t      cStrings;
     207    /** Expected result (IPRT-style). */
     208    int         iResult;
     209} g_aTestPayloadToStringVector[] =
     210{
     211    /** Empty payload. */
     212    NULL, 0, 0, VINF_SUCCESS,
     213    RT_STR_TUPLE("\0"), 0, VINF_SUCCESS,
     214    RT_STR_TUPLE(""), 0, VINF_SUCCESS,
     215    ///** Invalid data. */
     216    RT_STR_TUPLE("two\0\0terminators"), 1, VERR_INVALID_PARAMETER,
     217    RT_STR_TUPLE("no\0\ending\0terminator"), 2, VERR_BUFFER_OVERFLOW,
     218    RT_STR_TUPLE("foo"), 0, VERR_BUFFER_OVERFLOW,
     219    /** Valid data. */
     220    RT_STR_TUPLE("foo\0"), 1, VINF_SUCCESS,
     221    RT_STR_TUPLE("foo\0bar\0"), 2, VINF_SUCCESS,
     222    RT_STR_TUPLE("twoendterminators\0\0"), 1, VINF_SUCCESS,
     223    RT_STR_TUPLE("이것은 테스트입니다\0bar\0"), 2, VINF_SUCCESS
     224};
     225
     226
     227/**
    197228 * Reads and parses the stream from a given file.
    198229 *
     
    399430    }
    400431
     432    /*
     433     * Payload to string vector testing.
     434     */
     435    for (unsigned iTest = 0; iTest < RT_ELEMENTS(g_aTestPayloadToStringVector); iTest++)
     436    {
     437        GuestWaitEventPayload Payload(0 /* Type */,
     438                                      g_aTestPayloadToStringVector[iTest].pbData, g_aTestPayloadToStringVector[iTest].cbData);
     439        std::vector<Utf8Str> vecStr;
     440        RTTEST_CHECK_RC(hTest, Payload.ToStringVector(vecStr), g_aTestPayloadToStringVector[iTest].iResult);
     441        RTTEST_CHECK(hTest, vecStr.size() == g_aTestPayloadToStringVector[iTest].cStrings);
     442    }
     443
    401444    RTTestRestoreAssertions(hTest);
    402445
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