From d329a3b6a77148839171132eb779577fe4b16cdd Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Wed, 27 Jan 2016 15:30:10 -0800 Subject: Fix pointer conversion error in SetElementPtrSize SetElementPtrSize used to cast from pointer to uint64_t which could sign extend with 32 bit dex2oat for 64 bit app image. Also removed C style casts and added more logging. Bug: 22858531 (cherry picked from commit d22886357d4c53f74ca298faa7ad2555794e17e0) Change-Id: I479124328fbc497cfcae20c43b4b55827e446527 --- runtime/mirror/array-inl.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'runtime/mirror/array-inl.h') diff --git a/runtime/mirror/array-inl.h b/runtime/mirror/array-inl.h index b6f424b3a4..4b98e5f7e0 100644 --- a/runtime/mirror/array-inl.h +++ b/runtime/mirror/array-inl.h @@ -381,19 +381,24 @@ inline T PointerArray::GetElementPtrSize(uint32_t idx, size_t ptr_size) { return (T)static_cast(AsIntArray()->GetWithoutChecks(idx)); } -template -inline void PointerArray::SetElementPtrSize(uint32_t idx, T element, size_t ptr_size) { +template +inline void PointerArray::SetElementPtrSize(uint32_t idx, uint64_t element, size_t ptr_size) { if (ptr_size == 8) { (kUnchecked ? down_cast(static_cast(this)) : AsLongArray())-> - SetWithoutChecks(idx, (uint64_t)(element)); + SetWithoutChecks(idx, element); } else { DCHECK_EQ(ptr_size, 4u); - DCHECK_LE((uintptr_t)element, 0xFFFFFFFFu); + DCHECK_LE(element, static_cast(0xFFFFFFFFu)); (kUnchecked ? down_cast(static_cast(this)) : AsIntArray()) - ->SetWithoutChecks(idx, static_cast((uintptr_t)element)); + ->SetWithoutChecks(idx, static_cast(element)); } } +template +inline void PointerArray::SetElementPtrSize(uint32_t idx, T* element, size_t ptr_size) { + SetElementPtrSize(idx, reinterpret_cast(element), ptr_size); +} + template inline void PointerArray::Fixup(mirror::PointerArray* dest, size_t pointer_size, -- cgit v1.2.3-59-g8ed1b