@@ -84,7 +84,7 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
84
84
let cs_start = read_encoded_pointer ( & mut reader, context, call_site_encoding) ?;
85
85
let cs_len = read_encoded_pointer ( & mut reader, context, call_site_encoding) ?;
86
86
let cs_lpad = read_encoded_pointer ( & mut reader, context, call_site_encoding) ?;
87
- let cs_action = reader. read_uleb128 ( ) ;
87
+ let cs_action_entry = reader. read_uleb128 ( ) ;
88
88
// Callsite table is sorted by cs_start, so if we've passed the ip, we
89
89
// may stop searching.
90
90
if ip < func_start + cs_start {
@@ -95,7 +95,15 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
95
95
return Ok ( EHAction :: None ) ;
96
96
} else {
97
97
let lpad = lpad_base + cs_lpad;
98
- return Ok ( interpret_cs_action ( cs_action, lpad) ) ;
98
+ if cs_action_entry == 0 {
99
+ return Ok ( interpret_cs_action ( 0 , lpad) ) ;
100
+ } else {
101
+ let action_record =
102
+ ( action_table as * mut u8 ) . offset ( cs_action_entry as isize - 1 ) ;
103
+ let mut action_reader = DwarfReader :: new ( action_record) ;
104
+ let ttype_index = action_reader. read_sleb128 ( ) ;
105
+ return Ok ( interpret_cs_action ( ttype_index as u64 , lpad) ) ;
106
+ }
99
107
}
100
108
}
101
109
}
0 commit comments