Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: chrome_elf/nt_registry/nt_registry_unittest.cc

Issue 2885243002: [NtRegistry] Ensure REG_SZ and REG_MULTI_SZ are null terminated. (Closed)
Patch Set: Code review fixes, part 1. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome_elf/nt_registry/nt_registry.h" 5 #include "chrome_elf/nt_registry/nt_registry.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <rpc.h> 8 #include <rpc.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); 341 EXPECT_TRUE(nt::DeleteRegKey(key_handle));
342 nt::CloseRegKey(key_handle); 342 nt::CloseRegKey(key_handle);
343 } 343 }
344 344
345 TEST_F(NtRegistryTest, API_SZ) { 345 TEST_F(NtRegistryTest, API_SZ) {
346 HANDLE key_handle; 346 HANDLE key_handle;
347 const wchar_t* sz_val_name = L"SzTestValue"; 347 const wchar_t* sz_val_name = L"SzTestValue";
348 std::wstring sz_val = L"blah de blah de blahhhhh."; 348 std::wstring sz_val = L"blah de blah de blahhhhh.";
349 const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; 349 const wchar_t* sz_val_name2 = L"SzTestValueEmpty";
350 std::wstring sz_val2 = L""; 350 std::wstring sz_val2 = L"";
351 const wchar_t* sz_val_name3 = L"SzTestValueMalformed";
352 const wchar_t* sz_val_name4 = L"SzTestValueMalformed2";
353 std::wstring sz_val3 = L"malformed";
354 BYTE* sz_val3_byte = reinterpret_cast<BYTE*>(&sz_val3[0]);
355 std::vector<BYTE> malform;
356 for (size_t i = 0; i < (sz_val3.size() * sizeof(wchar_t)); i++)
357 malform.push_back(sz_val3_byte[i]);
358 const wchar_t* sz_val_name5 = L"SzTestValueSize0";
351 359
352 // Create a subkey to play under. 360 // Create a subkey to play under.
361 // ------------------------------
353 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS, 362 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS,
354 &key_handle)); 363 &key_handle));
355 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); 364 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE);
356 ASSERT_NE(key_handle, nullptr); 365 ASSERT_NE(key_handle, nullptr);
357 366
358 std::wstring get_sz; 367 std::wstring get_sz;
359 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); 368 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz));
360 369
361 // Set 370 // Set
371 // ------------------------------
362 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val)); 372 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val));
363 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2)); 373 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2));
374 // No null terminator.
375 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name3, REG_SZ,
376 malform.data(), malform.size()));
377 malform.push_back(0);
378 // Single trailing 0 byte.
379 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name4, REG_SZ,
380 malform.data(), malform.size()));
381 // Size 0 value.
382 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name5, REG_SZ, nullptr, 0));
364 383
365 // Get 384 // Get
385 // ------------------------------
366 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); 386 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz));
367 EXPECT_TRUE(get_sz.compare(sz_val) == 0); 387 EXPECT_TRUE(get_sz.compare(sz_val) == 0);
368 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz)); 388 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz));
369 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); 389 EXPECT_TRUE(get_sz.compare(sz_val2) == 0);
390 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name3, &get_sz));
391 // Should be adjusted under the hood to equal sz_val3.
392 EXPECT_TRUE(get_sz.compare(sz_val3) == 0);
393 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name4, &get_sz));
394 // Should be adjusted under the hood to equal sz_val3.
395 EXPECT_TRUE(get_sz.compare(sz_val3) == 0);
396 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name5, &get_sz));
397 // Should be adjusted under the hood to an empty string.
398 EXPECT_TRUE(get_sz.compare(sz_val2) == 0);
370 399
371 // Clean up 400 // Clean up
401 // ------------------------------
372 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); 402 EXPECT_TRUE(nt::DeleteRegKey(key_handle));
373 nt::CloseRegKey(key_handle); 403 nt::CloseRegKey(key_handle);
374 } 404 }
375 405
376 TEST_F(NtRegistryTest, API_MULTISZ) { 406 TEST_F(NtRegistryTest, API_MULTISZ) {
377 HANDLE key_handle; 407 HANDLE key_handle;
378 const wchar_t* multisz_val_name = L"SzmultiTestValue"; 408 const wchar_t* multisz_val_name = L"SzmultiTestValue";
379 std::vector<std::wstring> multisz_val; 409 std::vector<std::wstring> multisz_val;
380 std::wstring multi1 = L"one"; 410 std::wstring multi1 = L"one";
381 std::wstring multi2 = L"two"; 411 std::wstring multi2 = L"two";
382 std::wstring multi3 = L"three"; 412 std::wstring multi3 = L"three";
383 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; 413 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad";
384 std::wstring multi_empty = L""; 414 std::wstring multi_empty = L"";
415 const wchar_t* multisz_val_name3 = L"SzmultiTestValueMalformed";
416 const wchar_t* multisz_val_name4 = L"SzmultiTestValueMalformed2";
417 const wchar_t* multisz_val_name5 = L"SzmultiTestValueMalformed3";
418 const wchar_t* multisz_val_name6 = L"SzmultiTestValueMalformed4";
419 std::wstring multisz_val3 = L"malformed";
420 BYTE* multisz_val3_byte = reinterpret_cast<BYTE*>(&multisz_val3[0]);
421 std::vector<BYTE> malform;
422 for (size_t i = 0; i < (multisz_val3.size() * sizeof(wchar_t)); i++)
423 malform.push_back(multisz_val3_byte[i]);
424 const wchar_t* multisz_val_name7 = L"SzmultiTestValueSize0";
385 425
386 // Create a subkey to play under. 426 // Create a subkey to play under.
427 // ------------------------------
387 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS, 428 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS,
388 &key_handle)); 429 &key_handle));
389 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); 430 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE);
390 ASSERT_NE(key_handle, nullptr); 431 ASSERT_NE(key_handle, nullptr);
391 432
392 multisz_val.push_back(multi1); 433 multisz_val.push_back(multi1);
393 multisz_val.push_back(multi2); 434 multisz_val.push_back(multi2);
394 multisz_val.push_back(multi3); 435 multisz_val.push_back(multi3);
436
395 // Set 437 // Set
438 // ------------------------------
396 EXPECT_TRUE( 439 EXPECT_TRUE(
397 nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val)); 440 nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val));
398 multisz_val.clear(); 441 multisz_val.clear();
399 multisz_val.push_back(multi_empty); 442 multisz_val.push_back(multi_empty);
400 // Set 443
401 EXPECT_TRUE( 444 EXPECT_TRUE(
402 nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val)); 445 nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val));
403 multisz_val.clear(); 446 multisz_val.clear();
404 447
448 // No null terminator.
449 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name3, REG_MULTI_SZ,
450 malform.data(), malform.size()));
451 malform.push_back(0);
452 // Single trailing 0 byte.
453 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name4, REG_MULTI_SZ,
454 malform.data(), malform.size()));
455 malform.push_back(0);
456 // Two trailing 0 bytes.
457 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name5, REG_MULTI_SZ,
458 malform.data(), malform.size()));
459 malform.push_back(0);
460 // Three trailing 0 bytes.
461 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name6, REG_MULTI_SZ,
462 malform.data(), malform.size()));
463
464 // Size 0 value.
465 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name7, REG_MULTI_SZ,
466 nullptr, 0));
467
405 // Get 468 // Get
469 // ------------------------------
406 EXPECT_TRUE( 470 EXPECT_TRUE(
407 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val)); 471 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val));
408 if (multisz_val.size() == 3) { 472 if (multisz_val.size() == 3) {
409 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0); 473 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0);
410 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0); 474 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0);
411 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0); 475 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0);
412 } else { 476 } else {
413 EXPECT_TRUE(false); 477 EXPECT_TRUE(false);
414 } 478 }
415 multisz_val.clear(); 479 multisz_val.clear();
416 480
417 // Get
418 EXPECT_TRUE( 481 EXPECT_TRUE(
419 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val)); 482 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val));
420 if (multisz_val.size() == 1) { 483 EXPECT_EQ(multisz_val.size(), static_cast<DWORD>(0));
421 EXPECT_TRUE(multi_empty.compare(multisz_val.at(0)) == 0); 484 multisz_val.clear();
485
486 EXPECT_TRUE(
487 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name3, &multisz_val));
488 if (multisz_val.size(), 1) {
489 // Should be adjusted under the hood to equal sz_val3.
490 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0);
422 } else { 491 } else {
423 EXPECT_TRUE(false); 492 EXPECT_TRUE(false);
424 } 493 }
425 multisz_val.clear(); 494 multisz_val.clear();
426 495
496 EXPECT_TRUE(
497 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name4, &multisz_val));
498 if (multisz_val.size(), 1) {
499 // Should be adjusted under the hood to equal sz_val3.
500 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0);
501 } else {
502 EXPECT_TRUE(false);
503 }
504 multisz_val.clear();
505
506 EXPECT_TRUE(
507 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name5, &multisz_val));
508 if (multisz_val.size(), 1) {
509 // Should be adjusted under the hood to equal sz_val3.
510 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0);
511 } else {
512 EXPECT_TRUE(false);
513 }
514 multisz_val.clear();
515
516 EXPECT_TRUE(
517 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name6, &multisz_val));
518 if (multisz_val.size(), 1) {
519 // Should be adjusted under the hood to equal sz_val3.
520 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0);
521 } else {
522 EXPECT_TRUE(false);
523 }
524 multisz_val.clear();
525
526 EXPECT_TRUE(
527 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name7, &multisz_val));
528 // Should be adjusted under the hood to an empty string.
529 EXPECT_TRUE(multisz_val.empty());
530
427 // Clean up 531 // Clean up
532 // ------------------------------
428 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); 533 EXPECT_TRUE(nt::DeleteRegKey(key_handle));
429 nt::CloseRegKey(key_handle); 534 nt::CloseRegKey(key_handle);
430 } 535 }
431 536
432 TEST_F(NtRegistryTest, CreateRegKeyRecursion) { 537 TEST_F(NtRegistryTest, CreateRegKeyRecursion) {
433 HANDLE key_handle; 538 HANDLE key_handle;
434 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey"; 539 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey";
435 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\"; 540 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\";
436 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2"; 541 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2";
437 542
(...skipping 20 matching lines...) Expand all
458 nt::CloseRegKey(key_handle); 563 nt::CloseRegKey(key_handle);
459 564
460 // Subkey path can be null. 565 // Subkey path can be null.
461 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS, &key_handle)); 566 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS, &key_handle));
462 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); 567 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE);
463 ASSERT_NE(key_handle, nullptr); 568 ASSERT_NE(key_handle, nullptr);
464 nt::CloseRegKey(key_handle); 569 nt::CloseRegKey(key_handle);
465 } 570 }
466 571
467 } // namespace 572 } // namespace
OLDNEW
« chrome_elf/nt_registry/nt_registry.cc ('K') | « chrome_elf/nt_registry/nt_registry.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698