diff options
author | Christopher Ferris <cferris@google.com> | 2017-04-03 12:39:47 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2017-04-03 18:36:33 -0700 |
commit | f447c8eb205d899085968a0a8dfae861ef56a589 (patch) | |
tree | b7cbe68673663760db5330d33c2fd75d2651fcbe /libunwindstack/tests/MemoryFileTest.cpp | |
parent | 8aae1b158ad45bd3a7eeace9558ee7390b12fa94 (diff) |
Add overflow checks in Memory objects.
Also change one of the reads to be explicitly ReadField instead of an
overloaded Read function.
Bug: 23762183
Test: Passes new unit tests.
Change-Id: Id848f7b632f67df0c5b7318d9e588942cfd2099a
Diffstat (limited to 'libunwindstack/tests/MemoryFileTest.cpp')
-rw-r--r-- | libunwindstack/tests/MemoryFileTest.cpp | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/libunwindstack/tests/MemoryFileTest.cpp b/libunwindstack/tests/MemoryFileTest.cpp index 870ca19d2..aa7a23a34 100644 --- a/libunwindstack/tests/MemoryFileTest.cpp +++ b/libunwindstack/tests/MemoryFileTest.cpp @@ -14,6 +14,9 @@ * limitations under the License. */ +#include <string> +#include <vector> + #include <android-base/test_utils.h> #include <android-base/file.h> #include <gtest/gtest.h> @@ -39,7 +42,7 @@ class MemoryFileTest : public ::testing::Test { TemporaryFile* tf_ = nullptr; }; -TEST_F(MemoryFileTest, offset_0) { +TEST_F(MemoryFileTest, init_offset_0) { WriteTestData(); ASSERT_TRUE(memory_.Init(tf_->path, 0)); @@ -49,7 +52,7 @@ TEST_F(MemoryFileTest, offset_0) { ASSERT_STREQ("0123456789", buffer.data()); } -TEST_F(MemoryFileTest, offset_non_zero) { +TEST_F(MemoryFileTest, init_offset_non_zero) { WriteTestData(); ASSERT_TRUE(memory_.Init(tf_->path, 10)); @@ -59,7 +62,7 @@ TEST_F(MemoryFileTest, offset_non_zero) { ASSERT_STREQ("abcdefghij", buffer.data()); } -TEST_F(MemoryFileTest, offset_non_zero_larger_than_pagesize) { +TEST_F(MemoryFileTest, init_offset_non_zero_larger_than_pagesize) { size_t pagesize = getpagesize(); std::string large_string; for (size_t i = 0; i < pagesize; i++) { @@ -75,7 +78,7 @@ TEST_F(MemoryFileTest, offset_non_zero_larger_than_pagesize) { ASSERT_STREQ("abcdefgh", buffer.data()); } -TEST_F(MemoryFileTest, offset_pagesize_aligned) { +TEST_F(MemoryFileTest, init_offset_pagesize_aligned) { size_t pagesize = getpagesize(); std::string data; for (size_t i = 0; i < 2 * pagesize; i++) { @@ -96,7 +99,7 @@ TEST_F(MemoryFileTest, offset_pagesize_aligned) { ASSERT_STREQ(expected_str.c_str(), buffer.data()); } -TEST_F(MemoryFileTest, offset_pagesize_aligned_plus_extra) { +TEST_F(MemoryFileTest, init_offset_pagesize_aligned_plus_extra) { size_t pagesize = getpagesize(); std::string data; for (size_t i = 0; i < 2 * pagesize; i++) { @@ -117,6 +120,23 @@ TEST_F(MemoryFileTest, offset_pagesize_aligned_plus_extra) { ASSERT_STREQ(expected_str.c_str(), buffer.data()); } +TEST_F(MemoryFileTest, init_offset_greater_than_filesize) { + size_t pagesize = getpagesize(); + std::string data; + uint64_t file_size = 2 * pagesize + pagesize / 2; + for (size_t i = 0; i < file_size; i++) { + data += static_cast<char>((i / pagesize) + '0'); + } + ASSERT_TRUE(android::base::WriteStringToFd(data, tf_->fd)); + + // Check offset > file size fails and aligned_offset > file size. + ASSERT_FALSE(memory_.Init(tf_->path, file_size + 2 * pagesize)); + // Check offset == filesize fails. + ASSERT_FALSE(memory_.Init(tf_->path, file_size)); + // Check aligned_offset < filesize, but offset > filesize fails. + ASSERT_FALSE(memory_.Init(tf_->path, 2 * pagesize + pagesize / 2 + pagesize / 4)); +} + TEST_F(MemoryFileTest, read_error) { std::string data; for (size_t i = 0; i < 5000; i++) { @@ -137,32 +157,9 @@ TEST_F(MemoryFileTest, read_error) { ASSERT_TRUE(memory_.Read(4990, buffer.data(), 10)); ASSERT_FALSE(memory_.Read(4999, buffer.data(), 2)); ASSERT_TRUE(memory_.Read(4999, buffer.data(), 1)); -} - -TEST_F(MemoryFileTest, read_string) { - std::string value("name_in_file"); - ASSERT_TRUE(android::base::WriteFully(tf_->fd, value.c_str(), value.size() + 1)); - - std::string name; - ASSERT_TRUE(memory_.Init(tf_->path, 0)); - ASSERT_TRUE(memory_.ReadString(0, &name)); - ASSERT_EQ("name_in_file", name); - ASSERT_TRUE(memory_.ReadString(5, &name)); - ASSERT_EQ("in_file", name); -} - -TEST_F(MemoryFileTest, read_string_error) { - std::vector<uint8_t> buffer = { 0x23, 0x32, 0x45 }; - ASSERT_TRUE(android::base::WriteFully(tf_->fd, buffer.data(), buffer.size())); - - std::string name; - ASSERT_TRUE(memory_.Init(tf_->path, 0)); - - // Read from a non-existant address. - ASSERT_FALSE(memory_.ReadString(100, &name)); - // This should fail because there is no terminating \0 - ASSERT_FALSE(memory_.ReadString(0, &name)); + // Check that overflow fails properly. + ASSERT_FALSE(memory_.Read(UINT64_MAX - 100, buffer.data(), 200)); } TEST_F(MemoryFileTest, read_past_file_within_mapping) { |