- Timestamp:
- Dec 21, 2023 9:20:02 AM (9 months ago)
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
-
include/GuestCtrlImplPrivate.h (modified) (2 diffs)
-
testcase/tstGuestCtrlParseBuffer.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h
r102654 r102667 1214 1214 * Returns the payload as a vector of strings, validated. 1215 1215 * 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 * 1216 1221 * @returns VBox status code. 1217 1222 * @param vecStrings Where to return the vector of strings on success. … … 1224 1229 1225 1230 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); 1241 1259 } 1242 1243 if (RT_SUCCESS(vrc))1244 AssertStmt(cb <= 1 /* Ending terminator */, vrc = VERR_INVALID_PARAMETER);1245 1260 return vrc; 1246 1261 } -
trunk/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp
r99640 r102667 195 195 196 196 /** 197 * Tests payload data to string vector parsing. 198 */ 199 static 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 /** 197 228 * Reads and parses the stream from a given file. 198 229 * … … 399 430 } 400 431 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 401 444 RTTestRestoreAssertions(hTest); 402 445
Note:
See TracChangeset
for help on using the changeset viewer.

