From 4c39e08e16e672a8b93061ff5e241873abef6fc4 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Mon, 30 Apr 2018 13:44:22 +0200 Subject: Fix UBSAN warnings in masm Change-Id: Ie86307fe55fce957adf48e9861022fddfa3d7374 Reviewed-by: Simon Hausmann --- src/3rdparty/masm/assembler/AssemblerBuffer.h | 2 +- src/3rdparty/masm/assembler/X86Assembler.h | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'src/3rdparty') diff --git a/src/3rdparty/masm/assembler/AssemblerBuffer.h b/src/3rdparty/masm/assembler/AssemblerBuffer.h index 277ec1043c..45874235b6 100644 --- a/src/3rdparty/masm/assembler/AssemblerBuffer.h +++ b/src/3rdparty/masm/assembler/AssemblerBuffer.h @@ -102,7 +102,7 @@ namespace JSC { void putIntegralUnchecked(IntegralType value) { ASSERT(isAvailable(sizeof(IntegralType))); - *reinterpret_cast_ptr(m_buffer + m_index) = value; + memcpy(m_buffer + m_index, &value, sizeof(IntegralType)); m_index += sizeof(IntegralType); } diff --git a/src/3rdparty/masm/assembler/X86Assembler.h b/src/3rdparty/masm/assembler/X86Assembler.h index b71cf290f8..6fa66e0dd7 100644 --- a/src/3rdparty/masm/assembler/X86Assembler.h +++ b/src/3rdparty/masm/assembler/X86Assembler.h @@ -1892,9 +1892,18 @@ public: ASSERT(to.isSet()); char* code = reinterpret_cast(m_formatter.data()); - ASSERT(!reinterpret_cast(code + from.m_offset)[-1]); + ASSERT(!loadPossiblyUnaligned(code, from.m_offset, -1)); setRel32(code + from.m_offset, code + to.m_offset); } + + template + T loadPossiblyUnaligned(char *ptr, size_t offset, int idx) + { + T *t_ptr = &reinterpret_cast(ptr + offset)[idx]; + T val; + memcpy(&val, t_ptr, sizeof(T)); + return val; + } static void linkJump(void* code, AssemblerLabel from, void* to) { @@ -2095,7 +2104,14 @@ private: static void setInt32(void* where, int32_t value) { - reinterpret_cast(where)[-1] = value; + storePossiblyUnaligned(where, -1, value); + } + + template + static void storePossiblyUnaligned(void *where, int idx, T value) + { + T *ptr = &reinterpret_cast(where)[idx]; + memcpy(ptr, &value, sizeof(T)); } static void setInt8(void* where, int8_t value) -- cgit v1.2.3