Index: chrome_elf/nt_registry/nt_registry_unittest.cc |
diff --git a/chrome_elf/nt_registry/nt_registry_unittest.cc b/chrome_elf/nt_registry/nt_registry_unittest.cc |
index 0d54cb5f7533e0d89ca18a64037f57c17c7e1434..ee8f1af0ee8bf51ad21ad07ddb39f964fce50852 100644 |
--- a/chrome_elf/nt_registry/nt_registry_unittest.cc |
+++ b/chrome_elf/nt_registry/nt_registry_unittest.cc |
@@ -348,8 +348,17 @@ TEST_F(NtRegistryTest, API_SZ) { |
std::wstring sz_val = L"blah de blah de blahhhhh."; |
const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; |
std::wstring sz_val2 = L""; |
+ const wchar_t* sz_val_name3 = L"SzTestValueMalformed"; |
+ const wchar_t* sz_val_name4 = L"SzTestValueMalformed2"; |
+ std::wstring sz_val3 = L"malformed"; |
+ BYTE* sz_val3_byte = reinterpret_cast<BYTE*>(&sz_val3[0]); |
+ std::vector<BYTE> malform; |
+ for (size_t i = 0; i < (sz_val3.size() * sizeof(wchar_t)); i++) |
+ malform.push_back(sz_val3_byte[i]); |
+ const wchar_t* sz_val_name5 = L"SzTestValueSize0"; |
// Create a subkey to play under. |
+ // ------------------------------ |
ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS, |
&key_handle)); |
ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); |
@@ -359,16 +368,39 @@ TEST_F(NtRegistryTest, API_SZ) { |
EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); |
// Set |
+ // ------------------------------ |
EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val)); |
EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2)); |
+ // No null terminator. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name3, REG_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ malform.push_back(0); |
+ // Single trailing 0 byte. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name4, REG_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ // Size 0 value. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name5, REG_SZ, nullptr, 0)); |
// Get |
+ // ------------------------------ |
EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); |
EXPECT_TRUE(get_sz.compare(sz_val) == 0); |
EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz)); |
EXPECT_TRUE(get_sz.compare(sz_val2) == 0); |
+ EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name3, &get_sz)); |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(get_sz.compare(sz_val3) == 0); |
+ EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name4, &get_sz)); |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(get_sz.compare(sz_val3) == 0); |
+ EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name5, &get_sz)); |
+ // Should be adjusted under the hood to an empty string. |
+ EXPECT_TRUE(get_sz.compare(sz_val2) == 0); |
// Clean up |
+ // ------------------------------ |
EXPECT_TRUE(nt::DeleteRegKey(key_handle)); |
nt::CloseRegKey(key_handle); |
} |
@@ -382,8 +414,19 @@ TEST_F(NtRegistryTest, API_MULTISZ) { |
std::wstring multi3 = L"three"; |
const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; |
std::wstring multi_empty = L""; |
+ const wchar_t* multisz_val_name3 = L"SzmultiTestValueMalformed"; |
+ const wchar_t* multisz_val_name4 = L"SzmultiTestValueMalformed2"; |
+ const wchar_t* multisz_val_name5 = L"SzmultiTestValueMalformed3"; |
+ const wchar_t* multisz_val_name6 = L"SzmultiTestValueMalformed4"; |
+ std::wstring multisz_val3 = L"malformed"; |
+ BYTE* multisz_val3_byte = reinterpret_cast<BYTE*>(&multisz_val3[0]); |
+ std::vector<BYTE> malform; |
+ for (size_t i = 0; i < (multisz_val3.size() * sizeof(wchar_t)); i++) |
+ malform.push_back(multisz_val3_byte[i]); |
+ const wchar_t* multisz_val_name7 = L"SzmultiTestValueSize0"; |
// Create a subkey to play under. |
+ // ------------------------------ |
ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS, |
&key_handle)); |
ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); |
@@ -392,17 +435,44 @@ TEST_F(NtRegistryTest, API_MULTISZ) { |
multisz_val.push_back(multi1); |
multisz_val.push_back(multi2); |
multisz_val.push_back(multi3); |
+ |
// Set |
+ // ------------------------------ |
EXPECT_TRUE( |
nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val)); |
multisz_val.clear(); |
multisz_val.push_back(multi_empty); |
- // Set |
+ |
EXPECT_TRUE( |
nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val)); |
multisz_val.clear(); |
+ // No null terminator. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name3, REG_MULTI_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ malform.push_back(0); |
+ // Single trailing 0 byte. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name4, REG_MULTI_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ malform.push_back(0); |
+ // Two trailing 0 bytes. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name5, REG_MULTI_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ malform.push_back(0); |
+ // Three trailing 0 bytes. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name6, REG_MULTI_SZ, |
+ malform.data(), |
+ static_cast<DWORD>(malform.size()))); |
+ |
+ // Size 0 value. |
+ EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name7, REG_MULTI_SZ, |
+ nullptr, 0)); |
+ |
// Get |
+ // ------------------------------ |
EXPECT_TRUE( |
nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val)); |
if (multisz_val.size() == 3) { |
@@ -414,17 +484,58 @@ TEST_F(NtRegistryTest, API_MULTISZ) { |
} |
multisz_val.clear(); |
- // Get |
EXPECT_TRUE( |
nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val)); |
- if (multisz_val.size() == 1) { |
- EXPECT_TRUE(multi_empty.compare(multisz_val.at(0)) == 0); |
+ EXPECT_EQ(multisz_val.size(), static_cast<DWORD>(0)); |
+ multisz_val.clear(); |
+ |
+ EXPECT_TRUE( |
+ nt::QueryRegValueMULTISZ(key_handle, multisz_val_name3, &multisz_val)); |
+ if (multisz_val.size(), 1) { |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
+ } else { |
+ EXPECT_TRUE(false); |
+ } |
+ multisz_val.clear(); |
+ |
+ EXPECT_TRUE( |
+ nt::QueryRegValueMULTISZ(key_handle, multisz_val_name4, &multisz_val)); |
+ if (multisz_val.size(), 1) { |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
} else { |
EXPECT_TRUE(false); |
} |
multisz_val.clear(); |
+ EXPECT_TRUE( |
+ nt::QueryRegValueMULTISZ(key_handle, multisz_val_name5, &multisz_val)); |
+ if (multisz_val.size(), 1) { |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
+ } else { |
+ EXPECT_TRUE(false); |
+ } |
+ multisz_val.clear(); |
+ |
+ EXPECT_TRUE( |
+ nt::QueryRegValueMULTISZ(key_handle, multisz_val_name6, &multisz_val)); |
+ if (multisz_val.size(), 1) { |
+ // Should be adjusted under the hood to equal sz_val3. |
+ EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
+ } else { |
+ EXPECT_TRUE(false); |
+ } |
+ multisz_val.clear(); |
+ |
+ EXPECT_TRUE( |
+ nt::QueryRegValueMULTISZ(key_handle, multisz_val_name7, &multisz_val)); |
+ // Should be adjusted under the hood to an empty string. |
+ EXPECT_TRUE(multisz_val.empty()); |
+ |
// Clean up |
+ // ------------------------------ |
EXPECT_TRUE(nt::DeleteRegKey(key_handle)); |
nt::CloseRegKey(key_handle); |
} |