summaryrefslogtreecommitdiffstats
path: root/libs/utils
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-03-29 13:45:18 -0700
committerMathias Agopian <mathias@google.com>2010-03-29 13:45:18 -0700
commitcaeddc7236a41bc51e60d54f5fa0e67cddd7aba6 (patch)
treeb84d3fb2486cbc8c0a1a826617fdf1cb28eb2587 /libs/utils
parentafa2eac17aa5b23af5c89a8542142a47fe8c9914 (diff)
downloadframeworks_native-caeddc7236a41bc51e60d54f5fa0e67cddd7aba6.zip
frameworks_native-caeddc7236a41bc51e60d54f5fa0e67cddd7aba6.tar.gz
frameworks_native-caeddc7236a41bc51e60d54f5fa0e67cddd7aba6.tar.bz2
fix [2542425] memory leak during video recording
Vector::sort() is using _do_copy() incorrectly; _do_copy() calls the copy constructor, not the assignment operator, so we need to destroy the "destination" before copying the item. Change-Id: Iaeeac808fa5341a7d219edeba4aa63d44f31473c
Diffstat (limited to 'libs/utils')
-rw-r--r--libs/utils/VectorImpl.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/libs/utils/VectorImpl.cpp b/libs/utils/VectorImpl.cpp
index 2c2d667..0322af7 100644
--- a/libs/utils/VectorImpl.cpp
+++ b/libs/utils/VectorImpl.cpp
@@ -173,9 +173,10 @@ status_t VectorImpl::sort(VectorImpl::compar_r_t cmp, void* state)
if (!array) return NO_MEMORY;
temp = malloc(mItemSize);
if (!temp) return NO_MEMORY;
- _do_construct(temp, 1);
item = reinterpret_cast<char*>(array) + mItemSize*(i);
curr = reinterpret_cast<char*>(array) + mItemSize*(i-1);
+ } else {
+ _do_destroy(temp, 1);
}
_do_copy(temp, item, 1);
@@ -183,12 +184,14 @@ status_t VectorImpl::sort(VectorImpl::compar_r_t cmp, void* state)
ssize_t j = i-1;
void* next = reinterpret_cast<char*>(array) + mItemSize*(i);
do {
+ _do_destroy(next, 1);
_do_copy(next, curr, 1);
next = curr;
--j;
curr = reinterpret_cast<char*>(array) + mItemSize*(j);
} while (j>=0 && (cmp(curr, temp, state) > 0));
+ _do_destroy(next, 1);
_do_copy(next, temp, 1);
}
i++;