diff options
author | liamjm <liamjm@chromium.org> | 2015-12-03 14:38:16 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-03 22:39:21 +0000 |
commit | 39fb5127a8a3a3f6216e48fd97ce9388c1e92c61 (patch) | |
tree | e6229a2f6816ab413573376ea760af775c804649 /sandbox/win/src/lpc_policy_test.cc | |
parent | aecbe2b387324d6a633ee732f7eb3ee2ff0cfea8 (diff) | |
download | chromium_src-39fb5127a8a3a3f6216e48fd97ce9388c1e92c61.zip chromium_src-39fb5127a8a3a3f6216e48fd97ce9388c1e92c61.tar.gz chromium_src-39fb5127a8a3a3f6216e48fd97ce9388c1e92c61.tar.bz2 |
Fixes for 1324523008 which was reverted. (Due to GetUserDefaultLocaleName being available on Vista and later)
Original description:
Add sbox tests related to warming up of locales.
Warm up locales in LowerToken() after RevertToSelf() as existing warmup was not working on Win 8.1 x64.
Remove existing warmup which was done outside of LowerToken().
BUG=464430
Review URL: https://codereview.chromium.org/1419483002
Cr-Commit-Position: refs/heads/master@{#363076}
Diffstat (limited to 'sandbox/win/src/lpc_policy_test.cc')
-rw-r--r-- | sandbox/win/src/lpc_policy_test.cc | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/sandbox/win/src/lpc_policy_test.cc b/sandbox/win/src/lpc_policy_test.cc new file mode 100644 index 0000000..ac7b39f --- /dev/null +++ b/sandbox/win/src/lpc_policy_test.cc @@ -0,0 +1,156 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// These tests have been added to specifically tests issues arising from (A)LPC +// lock down. + +#include <algorithm> +#include <cctype> + +#include <windows.h> +#include <winioctl.h> + +#include "base/win/windows_version.h" +#include "sandbox/win/src/sandbox.h" +#include "sandbox/win/src/sandbox_factory.h" +#include "sandbox/win/src/sandbox_policy.h" +#include "sandbox/win/tests/common/controller.h" +#include "sandbox/win/tests/common/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace sandbox { + +// Converts LCID to std::wstring for passing to sbox tests. +std::wstring LcidToWString(LCID lcid) { + wchar_t buff[10] = {0}; + int res = swprintf_s(buff, sizeof(buff) / sizeof(buff[0]), L"%08x", lcid); + if (-1 != res) { + return std::wstring(buff); + } + return std::wstring(); +} + +// Converts LANGID to std::wstring for passing to sbox tests. +std::wstring LangidToWString(LANGID langid) { + wchar_t buff[10] = {0}; + int res = swprintf_s(buff, sizeof(buff) / sizeof(buff[0]), L"%04x", langid); + if (-1 != res) { + return std::wstring(buff); + } + return std::wstring(); +} + +SBOX_TESTS_COMMAND int Lpc_GetUserDefaultLangID(int argc, wchar_t** argv) { + if (argc != 1) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + std::wstring expected_langid_string(argv[0]); + + // This will cause an exception if not warmed up suitably. + LANGID langid = ::GetUserDefaultLangID(); + + std::wstring langid_string = LangidToWString(langid); + if (0 == wcsncmp(langid_string.c_str(), expected_langid_string.c_str(), 4)) { + return SBOX_TEST_SUCCEEDED; + } + return SBOX_TEST_FAILED; +} + +TEST(LpcPolicyTest, GetUserDefaultLangID) { + LANGID langid = ::GetUserDefaultLangID(); + std::wstring cmd = L"Lpc_GetUserDefaultLangID " + LangidToWString(langid); + TestRunner runner; + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); +} + +SBOX_TESTS_COMMAND int Lpc_GetUserDefaultLCID(int argc, wchar_t** argv) { + if (argc != 1) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + std::wstring expected_lcid_string(argv[0]); + + // This will cause an exception if not warmed up suitably. + LCID lcid = ::GetUserDefaultLCID(); + + std::wstring lcid_string = LcidToWString(lcid); + if (0 == wcsncmp(lcid_string.c_str(), expected_lcid_string.c_str(), 8)) { + return SBOX_TEST_SUCCEEDED; + } + return SBOX_TEST_FAILED; +} + +TEST(LpcPolicyTest, GetUserDefaultLCID) { + LCID lcid = ::GetUserDefaultLCID(); + std::wstring cmd = L"Lpc_GetUserDefaultLCID " + LcidToWString(lcid); + TestRunner runner; + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); +} + +// GetUserDefaultLocaleName is not available on WIN XP. So we'll +// load it on-the-fly. +const wchar_t kKernel32DllName[] = L"kernel32.dll"; +typedef int(WINAPI* GetUserDefaultLocaleNameFunction)(LPWSTR lpLocaleName, + int cchLocaleName); + +SBOX_TESTS_COMMAND int Lpc_GetUserDefaultLocaleName(int argc, wchar_t** argv) { + if (argc != 1) + return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; + std::wstring expected_locale_name(argv[0]); + static GetUserDefaultLocaleNameFunction GetUserDefaultLocaleName_func = NULL; + if (!GetUserDefaultLocaleName_func) { + // GetUserDefaultLocaleName is not available on WIN XP. So we'll + // load it on-the-fly. + HMODULE kernel32_dll = ::GetModuleHandle(kKernel32DllName); + if (!kernel32_dll) { + return SBOX_TEST_FAILED; + } + GetUserDefaultLocaleName_func = + reinterpret_cast<GetUserDefaultLocaleNameFunction>( + GetProcAddress(kernel32_dll, "GetUserDefaultLocaleName")); + if (!GetUserDefaultLocaleName_func) { + return SBOX_TEST_FAILED; + } + } + wchar_t locale_name[LOCALE_NAME_MAX_LENGTH] = {0}; + // This will cause an exception if not warmed up suitably. + int ret = GetUserDefaultLocaleName_func( + locale_name, LOCALE_NAME_MAX_LENGTH * sizeof(wchar_t)); + if (!ret) { + return SBOX_TEST_FAILED; + } + if (!wcsnlen(locale_name, LOCALE_NAME_MAX_LENGTH)) { + return SBOX_TEST_FAILED; + } + if (0 == wcsncmp(locale_name, expected_locale_name.c_str(), + LOCALE_NAME_MAX_LENGTH)) { + return SBOX_TEST_SUCCEEDED; + } + return SBOX_TEST_FAILED; +} + +TEST(LpcPolicyTest, GetUserDefaultLocaleName) { + // GetUserDefaultLocaleName is not available before Vista. + if (base::win::GetVersion() < base::win::VERSION_VISTA) { + return; + } + static GetUserDefaultLocaleNameFunction GetUserDefaultLocaleName_func = NULL; + if (!GetUserDefaultLocaleName_func) { + // GetUserDefaultLocaleName is not available on WIN XP. So we'll + // load it on-the-fly. + HMODULE kernel32_dll = ::GetModuleHandle(kKernel32DllName); + EXPECT_NE(NULL, int(kernel32_dll)); + GetUserDefaultLocaleName_func = + reinterpret_cast<GetUserDefaultLocaleNameFunction>( + GetProcAddress(kernel32_dll, "GetUserDefaultLocaleName")); + EXPECT_NE(NULL, int(GetUserDefaultLocaleName_func)); + } + wchar_t locale_name[LOCALE_NAME_MAX_LENGTH] = {0}; + EXPECT_NE(0, GetUserDefaultLocaleName_func( + locale_name, LOCALE_NAME_MAX_LENGTH * sizeof(wchar_t))); + EXPECT_NE(0U, wcsnlen(locale_name, LOCALE_NAME_MAX_LENGTH)); + std::wstring cmd = + L"Lpc_GetUserDefaultLocaleName " + std::wstring(locale_name); + TestRunner runner; + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(cmd.c_str())); +} + +} // namespace sandbox |