diff options
author | Mathias Agopian <mathias@google.com> | 2010-03-29 13:45:18 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2010-03-29 13:45:18 -0700 |
commit | d74145285373193af8584ac86ee73c7aea3e1600 (patch) | |
tree | 6fcc000c7634f82eab97b860ebc171856d4f2023 /libs | |
parent | 9c3cee9824026764275e4d84ba9b5d9fdc5da690 (diff) | |
download | frameworks_base-d74145285373193af8584ac86ee73c7aea3e1600.zip frameworks_base-d74145285373193af8584ac86ee73c7aea3e1600.tar.gz frameworks_base-d74145285373193af8584ac86ee73c7aea3e1600.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')
-rw-r--r-- | libs/utils/VectorImpl.cpp | 5 |
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++; |