From 95cd300bbdb4538635a5dc7f08c184aff45637ad Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Thu, 26 May 2016 14:35:13 +0000 Subject: [PATCH] Don't access potentially mis-aligned, non-existent length field for non-array objects (fixes #486) --- src/avian/machine.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/avian/machine.h b/src/avian/machine.h index 40b627cdbc..3011dd47ed 100644 --- a/src/avian/machine.h +++ b/src/avian/machine.h @@ -1987,11 +1987,14 @@ inline unsigned baseSize(Thread* t UNUSED, object o, GcClass* class_) { assertT(t, class_->fixedSize() >= BytesPerWord); - return ceilingDivide(class_->fixedSize(), BytesPerWord) - + ceilingDivide(class_->arrayElementSize() - * fieldAtOffset( - o, class_->fixedSize() - BytesPerWord), - BytesPerWord); + unsigned size = ceilingDivide(class_->fixedSize(), BytesPerWord); + if (class_->arrayElementSize() > 0) { + size += ceilingDivide(class_->arrayElementSize() + * fieldAtOffset( + o, class_->fixedSize() - BytesPerWord), + BytesPerWord); + } + return size; } object makeTrace(Thread* t, Processor::StackWalker* walker);