It seems like a good change, so merged in r353287. Please let me know if you have any concerns.
On Tue, Jan 29, 2019 at 3:11 PM Hans Wennborg <h...@chromium.org> wrote: > > Should we merge this to 8.0? > > On Wed, Jan 23, 2019 at 10:04 PM Petr Hosek via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > > > Author: phosek > > Date: Wed Jan 23 19:04:42 2019 > > New Revision: 352016 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=352016&view=rev > > Log: > > [libunwind] Don't abort if encoutering invalid .eh_frame_hdr > > > > Recent Linux kernel release has introduced a bug as part of the ORC > > rollout where the vDSO has a valid .eh_frame section, but it's missing > > the .eh_frame_hdr section and GNU_EH_FRAME segment has zero size. This > > causes libunwind to abort which breaks programs that use libunwind. > > > > The other unwinder implementation (libgcc, non-gnu) instead silently > > bail out unless being compiled as debug. This change modifies libunwind > > to use the same strategy. > > > > Differential Revision: https://reviews.llvm.org/D57081 > > > > Modified: > > libunwind/trunk/src/AddressSpace.hpp > > libunwind/trunk/src/EHHeaderParser.hpp > > > > Modified: libunwind/trunk/src/AddressSpace.hpp > > URL: > > http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/AddressSpace.hpp?rev=352016&r1=352015&r2=352016&view=diff > > ============================================================================== > > --- libunwind/trunk/src/AddressSpace.hpp (original) > > +++ libunwind/trunk/src/AddressSpace.hpp Wed Jan 23 19:04:42 2019 > > @@ -535,11 +535,11 @@ inline bool LocalAddressSpace::findUnwin > > #endif > > cbdata->sects->dwarf_index_section = eh_frame_hdr_start; > > cbdata->sects->dwarf_index_section_length = phdr->p_memsz; > > - EHHeaderParser<LocalAddressSpace>::decodeEHHdr( > > + found_hdr = EHHeaderParser<LocalAddressSpace>::decodeEHHdr( > > *cbdata->addressSpace, eh_frame_hdr_start, phdr->p_memsz, > > hdrInfo); > > - cbdata->sects->dwarf_section = hdrInfo.eh_frame_ptr; > > - found_hdr = true; > > + if (found_hdr) > > + cbdata->sects->dwarf_section = hdrInfo.eh_frame_ptr; > > } > > } > > > > > > Modified: libunwind/trunk/src/EHHeaderParser.hpp > > URL: > > http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/EHHeaderParser.hpp?rev=352016&r1=352015&r2=352016&view=diff > > ============================================================================== > > --- libunwind/trunk/src/EHHeaderParser.hpp (original) > > +++ libunwind/trunk/src/EHHeaderParser.hpp Wed Jan 23 19:04:42 2019 > > @@ -35,7 +35,7 @@ public: > > uint8_t table_enc; > > }; > > > > - static void decodeEHHdr(A &addressSpace, pint_t ehHdrStart, pint_t > > ehHdrEnd, > > + static bool decodeEHHdr(A &addressSpace, pint_t ehHdrStart, pint_t > > ehHdrEnd, > > EHHeaderInfo &ehHdrInfo); > > static bool findFDE(A &addressSpace, pint_t pc, pint_t ehHdrStart, > > uint32_t sectionLength, > > @@ -52,12 +52,14 @@ private: > > }; > > > > template <typename A> > > -void EHHeaderParser<A>::decodeEHHdr(A &addressSpace, pint_t ehHdrStart, > > +bool EHHeaderParser<A>::decodeEHHdr(A &addressSpace, pint_t ehHdrStart, > > pint_t ehHdrEnd, EHHeaderInfo > > &ehHdrInfo) { > > pint_t p = ehHdrStart; > > uint8_t version = addressSpace.get8(p++); > > - if (version != 1) > > - _LIBUNWIND_ABORT("Unsupported .eh_frame_hdr version"); > > + if (version != 1) { > > + _LIBUNWIND_LOG0("Unsupported .eh_frame_hdr version"); > > + return false; > > + } > > > > uint8_t eh_frame_ptr_enc = addressSpace.get8(p++); > > uint8_t fde_count_enc = addressSpace.get8(p++); > > @@ -70,6 +72,8 @@ void EHHeaderParser<A>::decodeEHHdr(A &a > > ? 0 > > : addressSpace.getEncodedP(p, ehHdrEnd, fde_count_enc, > > ehHdrStart); > > ehHdrInfo.table = p; > > + > > + return true; > > } > > > > template <typename A> > > @@ -101,7 +105,9 @@ bool EHHeaderParser<A>::findFDE(A &addre > > pint_t ehHdrEnd = ehHdrStart + sectionLength; > > > > EHHeaderParser<A>::EHHeaderInfo hdrInfo; > > - EHHeaderParser<A>::decodeEHHdr(addressSpace, ehHdrStart, ehHdrEnd, > > hdrInfo); > > + if (!EHHeaderParser<A>::decodeEHHdr(addressSpace, ehHdrStart, ehHdrEnd, > > + hdrInfo)) > > + return false; > > > > size_t tableEntrySize = getTableEntrySize(hdrInfo.table_enc); > > pint_t tableEntry; > > > > > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits