From caeddc7236a41bc51e60d54f5fa0e67cddd7aba6 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 29 Mar 2010 13:45:18 -0700 Subject: 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 --- libs/utils/VectorImpl.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'libs/utils') diff --git a/libs/utils/VectorImpl.cpp b/libs/utils/VectorImpl.cpp index 2c2d6675c2..0322af7da7 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(array) + mItemSize*(i); curr = reinterpret_cast(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(array) + mItemSize*(i); do { + _do_destroy(next, 1); _do_copy(next, curr, 1); next = curr; --j; curr = reinterpret_cast(array) + mItemSize*(j); } while (j>=0 && (cmp(curr, temp, state) > 0)); + _do_destroy(next, 1); _do_copy(next, temp, 1); } i++; -- cgit v1.2.3-59-g8ed1b