summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-05-17 16:52:21 -0700
committerMathias Agopian <mathias@google.com>2012-05-17 17:47:44 -0700
commita9611c5d5b61c594b9f5f24b24a665dc1e647f81 (patch)
tree374a1d5bf2f273a78b98a983afaf03416a6d9c29
parentf17fdcaf0a315b02a3992fb4c52d5d4e38f5d291 (diff)
downloadnative-a9611c5d5b61c594b9f5f24b24a665dc1e647f81.tar.gz
fix a corruption in Vector<> when adding new items
would happen when vectors are copied and new items is added in both vectors. we didn't duplicate the underlying storage when adding items in vectors. Bug: 6515797 Change-Id: If544c07d96c05821e088d7f2c9b5736f7e306c31
-rw-r--r--libs/utils/VectorImpl.cpp2
-rw-r--r--libs/utils/tests/Android.mk1
-rw-r--r--libs/utils/tests/Vector_test.cpp75
3 files changed, 77 insertions, 1 deletions
diff --git a/libs/utils/VectorImpl.cpp b/libs/utils/VectorImpl.cpp
index 220ae3ea6a..e78faa820e 100644
--- a/libs/utils/VectorImpl.cpp
+++ b/libs/utils/VectorImpl.cpp
@@ -382,8 +382,8 @@ void* VectorImpl::_grow(size_t where, size_t amount)
}
}
} else {
+ void* array = editArrayImpl();
if (where != mCount) {
- void* array = editArrayImpl();
const void* from = reinterpret_cast<const uint8_t *>(array) + where*mItemSize;
void* to = reinterpret_cast<uint8_t *>(array) + (where+amount)*mItemSize;
_do_move_forward(to, from, mCount - where);
diff --git a/libs/utils/tests/Android.mk b/libs/utils/tests/Android.mk
index 98e4936e8f..0a5b3795a1 100644
--- a/libs/utils/tests/Android.mk
+++ b/libs/utils/tests/Android.mk
@@ -9,6 +9,7 @@ test_src_files := \
Looper_test.cpp \
String8_test.cpp \
Unicode_test.cpp \
+ Vector_test.cpp \
ZipFileRO_test.cpp
shared_libraries := \
diff --git a/libs/utils/tests/Vector_test.cpp b/libs/utils/tests/Vector_test.cpp
new file mode 100644
index 0000000000..d29c05445a
--- /dev/null
+++ b/libs/utils/tests/Vector_test.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#define LOG_TAG "Vector_test"
+
+#include <utils/Vector.h>
+#include <cutils/log.h>
+#include <gtest/gtest.h>
+#include <unistd.h>
+
+namespace android {
+
+class VectorTest : public testing::Test {
+protected:
+ virtual void SetUp() {
+ }
+
+ virtual void TearDown() {
+ }
+
+public:
+};
+
+
+TEST_F(VectorTest, CopyOnWrite_CopyAndAddElements) {
+
+ Vector<int> vector;
+ Vector<int> other;
+ vector.setCapacity(8);
+
+ vector.add(1);
+ vector.add(2);
+ vector.add(3);
+
+ EXPECT_EQ(vector.size(), 3);
+
+ // copy the vector
+ other = vector;
+
+ EXPECT_EQ(other.size(), 3);
+
+ // add an element to the first vector
+ vector.add(4);
+
+ // make sure the sizes are correct
+ EXPECT_EQ(vector.size(), 4);
+ EXPECT_EQ(other.size(), 3);
+
+ // add an element to the copy
+ other.add(5);
+
+ // make sure the sizes are correct
+ EXPECT_EQ(vector.size(), 4);
+ EXPECT_EQ(other.size(), 4);
+
+ // make sure the content of both vectors are correct
+ EXPECT_EQ(vector[3], 4);
+ EXPECT_EQ(other[3], 5);
+}
+
+
+} // namespace android