diff --git a/src/ehp.cpp b/src/ehp.cpp index c9af2206513fe1b53074b89e7441398b31f00e19..3e38d50667d6a925d3e24d1183a26ee1aebe98ff 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -444,7 +444,6 @@ void eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const if(eh_frame_util_t<ptrsize>::read_uleb128(uleb, pos, (const uint8_t* const)data.data(), max)) return ; cout<<" def_cfa_expression "<<dec<<uleb<<endl; - pos+=uleb; // doing this old school for now, as we aren't printing the expression. break; } case DW_CFA_expression: @@ -456,7 +455,6 @@ void eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const if(eh_frame_util_t<ptrsize>::read_uleb128(uleb2, pos, (const uint8_t* const)data.data(), max)) return ; cout<<" expression "<<dec<<uleb1<<" "<<uleb2<<endl; - pos+=uleb2; break; } case DW_CFA_val_expression: @@ -468,7 +466,6 @@ void eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const if(eh_frame_util_t<ptrsize>::read_uleb128(uleb2, pos, (const uint8_t* const)data.data(), max)) return ; cout<<" val_expression "<<dec<<uleb1<<" "<<uleb2<<endl; - pos+=uleb2; break; } case DW_CFA_def_cfa_offset_sf: @@ -755,18 +752,26 @@ bool eh_program_insn_t<ptrsize>::parse_insn( case DW_CFA_set_loc: pos+=ptrsize; + if(pos>max) + return true; break; case DW_CFA_advance_loc1: pos+=1; + if(pos>max) + return true; break; case DW_CFA_advance_loc2: pos+=2; + if(pos>max) + return true; break; case DW_CFA_advance_loc4: pos+=4; + if(pos>max) + return true; break; case DW_CFA_offset_extended: @@ -798,6 +803,10 @@ bool eh_program_insn_t<ptrsize>::parse_insn( if(eh_frame_util_t<ptrsize>::read_uleb128(uleb, pos, data, max)) return true; pos+=uleb; + if(pos>max) + return true; + if(pos>max) + return true; break; } case DW_CFA_expression: @@ -810,6 +819,8 @@ bool eh_program_insn_t<ptrsize>::parse_insn( if(eh_frame_util_t<ptrsize>::read_uleb128(uleb2, pos, data, max)) return true; pos+=uleb2; + if(pos>max) + return true; break; } case DW_CFA_def_cfa_offset_sf: