From: Pete Cooper Date: Wed, 23 Mar 2016 18:00:10 +0000 (+0000) Subject: Copy MachO struct to temporary to avoid unaligned load UB. X-Git-Tag: llvmorg-3.9.0-rc1~11145 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e82f3a099fa5c3b81eca29c4d5d0ce9ae4cdd923;p=platform%2Fupstream%2Fllvm.git Copy MachO struct to temporary to avoid unaligned load UB. We were already copying this data to a temporary for endian swaps. Now we just always copy it, but still only do the endian swaps when needed. llvm-svn: 264172 --- diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp index 7a9dd4b..39860bb 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp @@ -380,11 +380,11 @@ readBinary(std::unique_ptr &mb, reinterpret_cast(start + symOffset); // Convert each nlist_64 to a lld::mach_o::normalized::Symbol. for(uint32_t i=0; i < symCount; ++i) { - const nlist_64 *sin = &symbols[i]; nlist_64 tempSym; - if (isBig != llvm::sys::IsBigEndianHost) { - tempSym = *sin; swapStruct(tempSym); sin = &tempSym; - } + memcpy(&tempSym, &symbols[i], sizeof(nlist_64)); + const nlist_64 *sin = &tempSym; + if (isBig != llvm::sys::IsBigEndianHost) + swapStruct(tempSym); Symbol sout; if (sin->n_strx > strSize) return true;