@@ -330,7 +330,8 @@ uintptr_t ObPLEH::readEncodedPointer(const uint8_t **data, uint8_t encoding)
330330 case DW_EH_PE_funcrel:
331331 case DW_EH_PE_aligned:
332332 default :
333- // not supported
333+ LOG_ERROR_RET (OB_ERR_UNEXPECTED , " unsupported DWARF relative encoding in readEncodedPointer" ,
334+ K (encoding), " rel_encoding" , encoding & 0x70 );
334335 ob_abort ();
335336 break ;
336337 }
@@ -536,6 +537,12 @@ _Unwind_Reason_Code ObPLEH::handleLsda(int version,
536537 uint8_t lpStartEncoding = *lsda++;
537538
538539 if (lpStartEncoding != DW_EH_PE_omit) {
540+ uint8_t relEnc = lpStartEncoding & 0x70 ;
541+ if (relEnc != DW_EH_PE_absptr && relEnc != DW_EH_PE_pcrel) {
542+ LOG_WARN_RET (OB_ERR_UNEXPECTED , " unsupported lpStart encoding in LSDA, skip frame" ,
543+ K (lpStartEncoding), K (pc), K (funcStart));
544+ return _URC_CONTINUE_UNWIND;
545+ }
539546 readEncodedPointer (&lsda, lpStartEncoding);
540547 }
541548
@@ -548,6 +555,16 @@ _Unwind_Reason_Code ObPLEH::handleLsda(int version,
548555 }
549556
550557 uint8_t callSiteEncoding = *lsda++;
558+
559+ if (callSiteEncoding != DW_EH_PE_omit) {
560+ uint8_t relEnc = callSiteEncoding & 0x70 ;
561+ if (relEnc != DW_EH_PE_absptr && relEnc != DW_EH_PE_pcrel) {
562+ LOG_WARN_RET (OB_ERR_UNEXPECTED , " unsupported call site encoding in LSDA, skip frame" ,
563+ K (callSiteEncoding), K (pc), K (funcStart));
564+ return _URC_CONTINUE_UNWIND;
565+ }
566+ }
567+
551568 uint32_t callSiteTableLength = static_cast <uint32_t >(readULEB128 (&lsda));
552569 const uint8_t *callSiteTableStart = lsda;
553570 const uint8_t *callSiteTableEnd = callSiteTableStart + callSiteTableLength;
0 commit comments