From df4458e6d0b290df6ce5e5c15a2fbee8a396bbcf Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 24 Jul 2018 15:10:21 +0100 Subject: [PATCH] Fix bad loop count when inserting data into rdcarray --- renderdoc/api/replay/basic_types.h | 3 ++- renderdoc/replay/basic_types_tests.cpp | 36 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/renderdoc/api/replay/basic_types.h b/renderdoc/api/replay/basic_types.h index 06ce0e0d4..9f57d67fe 100644 --- a/renderdoc/api/replay/basic_types.h +++ b/renderdoc/api/replay/basic_types.h @@ -447,7 +447,8 @@ public: // destruct it before inserting. // first pass, copy - for(size_t i = 0; i < count; i++) + size_t copyCount = count < oldSize ? count : oldSize; + for(size_t i = 0; i < copyCount; i++) new(elems + oldSize + count - 1 - i) T(elems[oldSize - 1 - i]); // second pass, destruct & copy if there was any overlap diff --git a/renderdoc/replay/basic_types_tests.cpp b/renderdoc/replay/basic_types_tests.cpp index d3aa54f6d..2ac2922c3 100644 --- a/renderdoc/replay/basic_types_tests.cpp +++ b/renderdoc/replay/basic_types_tests.cpp @@ -286,6 +286,23 @@ TEST_CASE("Test array type", "[basictypes]") CHECK(vec[7] == 5); CHECK(vec[8] == 4); + // insert a large amount of data to ensure this doesn't read off start/end of vector + std::vector largedata; + largedata.resize(100000); + + vec.insert(4, largedata); + + REQUIRE(vec.size() == 9 + largedata.size()); + CHECK(vec[0] == 9); + CHECK(vec[1] == 6); + CHECK(vec[2] == 3); + CHECK(vec[3] == 20); + CHECK(vec[4 + largedata.size()] == 21); + CHECK(vec[5 + largedata.size()] == 8); + CHECK(vec[6 + largedata.size()] == 13); + CHECK(vec[7 + largedata.size()] == 5); + CHECK(vec[8 + largedata.size()] == 4); + vec.clear(); REQUIRE(vec.size() == 0); @@ -512,6 +529,25 @@ TEST_CASE("Test string type", "[basictypes][string]") CHECK(test.isEmpty()); CHECK(test.begin() == test.end()); CHECK_NULL_TERM(test); + + rdcstr test2; + + test2 = test; + + CHECK(test.size() == test2.size()); + CHECK(test.empty() == test2.empty()); + + for(size_t i = 0; i < test.size(); i++) + { + CHECK(test[i] == test2[i]); + } + + rdcstr empty; + + test2 = empty; + + CHECK(test.size() == empty.size()); + CHECK(test.empty() == empty.empty()); }; #endif // ENABLED(ENABLE_UNIT_TESTS) \ No newline at end of file