// Copyright 2019 The Crashpad Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "util/process/process_memory_sanitized.h" #include "gtest/gtest.h" #include "test/process_type.h" #include "util/misc/from_pointer_cast.h" #include "util/process/process_memory_native.h" #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) #include "test/linux/fake_ptrace_connection.h" #endif namespace crashpad { namespace test { namespace { TEST(ProcessMemorySanitized, DenyDisallowedMemory) { #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) FakePtraceConnection connection; ASSERT_TRUE(connection.Initialize(GetSelfProcess())); ProcessMemoryLinux memory(&connection); #else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(GetSelfProcess())); #endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS char c = 42; char out; ProcessMemorySanitized san_null; san_null.Initialize(&memory, nullptr); EXPECT_FALSE(san_null.Read(FromPointerCast(&c), 1, &out)); std::vector> allowed_memory; ProcessMemorySanitized san_empty; san_empty.Initialize(&memory, &allowed_memory); EXPECT_FALSE(san_empty.Read(FromPointerCast(&c), 1, &out)); } TEST(ProcessMemorySanitized, AllowedMemory) { #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) FakePtraceConnection connection; ASSERT_TRUE(connection.Initialize(GetSelfProcess())); ProcessMemoryLinux memory(&connection); #else ProcessMemoryNative memory; ASSERT_TRUE(memory.Initialize(GetSelfProcess())); #endif // OS_ANDROID || OS_LINUX || OS_CHROMEOS char str[4] = "ABC"; char out[4]; std::vector> allowed_memory; allowed_memory.push_back(std::make_pair(FromPointerCast(str + 1), FromPointerCast(str + 2))); ProcessMemorySanitized sanitized; sanitized.Initialize(&memory, &allowed_memory); EXPECT_FALSE(sanitized.Read(FromPointerCast(str), 1, &out)); EXPECT_TRUE(sanitized.Read(FromPointerCast(str + 1), 1, &out)); EXPECT_FALSE(sanitized.Read(FromPointerCast(str + 2), 1, &out)); } } // namespace } // namespace test } // namespace crashpad