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