1111
1212#![ allow( non_upper_case_globals) ]
1313#![ allow( unused) ]
14+ #![ forbid( unsafe_op_in_unsafe_fn) ]
1415
1516use super :: DwarfReader ;
1617use core:: mem;
@@ -70,45 +71,51 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
7071
7172 let func_start = context. func_start ;
7273 let mut reader = DwarfReader :: new ( lsda) ;
73-
74- let start_encoding = reader. read :: < u8 > ( ) ;
75- // base address for landing pad offsets
76- let lpad_base = if start_encoding != DW_EH_PE_omit {
77- read_encoded_pointer ( & mut reader, context, start_encoding) ?
78- } else {
79- func_start
74+ let lpad_base = unsafe {
75+ let start_encoding = reader. read :: < u8 > ( ) ;
76+ // base address for landing pad offsets
77+ if start_encoding != DW_EH_PE_omit {
78+ read_encoded_pointer ( & mut reader, context, start_encoding) ?
79+ } else {
80+ func_start
81+ }
8082 } ;
83+ let call_site_encoding = unsafe {
84+ let ttype_encoding = reader. read :: < u8 > ( ) ;
85+ if ttype_encoding != DW_EH_PE_omit {
86+ // Rust doesn't analyze exception types, so we don't care about the type table
87+ reader. read_uleb128 ( ) ;
88+ }
8189
82- let ttype_encoding = reader. read :: < u8 > ( ) ;
83- if ttype_encoding != DW_EH_PE_omit {
84- // Rust doesn't analyze exception types, so we don't care about the type table
85- reader. read_uleb128 ( ) ;
86- }
87-
88- let call_site_encoding = reader. read :: < u8 > ( ) ;
89- let call_site_table_length = reader. read_uleb128 ( ) ;
90- let action_table = reader. ptr . add ( call_site_table_length as usize ) ;
90+ reader. read :: < u8 > ( )
91+ } ;
92+ let action_table = unsafe {
93+ let call_site_table_length = reader. read_uleb128 ( ) ;
94+ reader. ptr . add ( call_site_table_length as usize )
95+ } ;
9196 let ip = context. ip ;
9297
9398 if !USING_SJLJ_EXCEPTIONS {
9499 // read the callsite table
95100 while reader. ptr < action_table {
96- // these are offsets rather than pointers;
97- let cs_start = read_encoded_offset ( & mut reader, call_site_encoding) ?;
98- let cs_len = read_encoded_offset ( & mut reader, call_site_encoding) ?;
99- let cs_lpad = read_encoded_offset ( & mut reader, call_site_encoding) ?;
100- let cs_action_entry = reader. read_uleb128 ( ) ;
101- // Callsite table is sorted by cs_start, so if we've passed the ip, we
102- // may stop searching.
103- if ip < func_start. wrapping_add ( cs_start) {
104- break ;
105- }
106- if ip < func_start. wrapping_add ( cs_start + cs_len) {
107- if cs_lpad == 0 {
108- return Ok ( EHAction :: None ) ;
109- } else {
110- let lpad = lpad_base. wrapping_add ( cs_lpad) ;
111- return Ok ( interpret_cs_action ( action_table, cs_action_entry, lpad) ) ;
101+ unsafe {
102+ // these are offsets rather than pointers;
103+ let cs_start = read_encoded_offset ( & mut reader, call_site_encoding) ?;
104+ let cs_len = read_encoded_offset ( & mut reader, call_site_encoding) ?;
105+ let cs_lpad = read_encoded_offset ( & mut reader, call_site_encoding) ?;
106+ let cs_action_entry = reader. read_uleb128 ( ) ;
107+ // Callsite table is sorted by cs_start, so if we've passed the ip, we
108+ // may stop searching.
109+ if ip < func_start. wrapping_add ( cs_start) {
110+ break ;
111+ }
112+ if ip < func_start. wrapping_add ( cs_start + cs_len) {
113+ if cs_lpad == 0 {
114+ return Ok ( EHAction :: None ) ;
115+ } else {
116+ let lpad = lpad_base. wrapping_add ( cs_lpad) ;
117+ return Ok ( interpret_cs_action ( action_table, cs_action_entry, lpad) ) ;
118+ }
112119 }
113120 }
114121 }
@@ -125,15 +132,15 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
125132 }
126133 let mut idx = ip. addr ( ) ;
127134 loop {
128- let cs_lpad = reader. read_uleb128 ( ) ;
129- let cs_action_entry = reader. read_uleb128 ( ) ;
135+ let cs_lpad = unsafe { reader. read_uleb128 ( ) } ;
136+ let cs_action_entry = unsafe { reader. read_uleb128 ( ) } ;
130137 idx -= 1 ;
131138 if idx == 0 {
132139 // Can never have null landing pad for sjlj -- that would have
133140 // been indicated by a -1 call site index.
134141 // FIXME(strict provenance)
135142 let lpad = ptr:: with_exposed_provenance ( ( cs_lpad + 1 ) as usize ) ;
136- return Ok ( interpret_cs_action ( action_table, cs_action_entry, lpad) ) ;
143+ return Ok ( unsafe { interpret_cs_action ( action_table, cs_action_entry, lpad) } ) ;
137144 }
138145 }
139146 }
@@ -151,9 +158,9 @@ unsafe fn interpret_cs_action(
151158 } else {
152159 // If lpad != 0 and cs_action_entry != 0, we have to check ttype_index.
153160 // If ttype_index == 0 under the condition, we take cleanup action.
154- let action_record = action_table. offset ( cs_action_entry as isize - 1 ) ;
161+ let action_record = unsafe { action_table. offset ( cs_action_entry as isize - 1 ) } ;
155162 let mut action_reader = DwarfReader :: new ( action_record) ;
156- let ttype_index = action_reader. read_sleb128 ( ) ;
163+ let ttype_index = unsafe { action_reader. read_sleb128 ( ) } ;
157164 if ttype_index == 0 {
158165 EHAction :: Cleanup ( lpad)
159166 } else if ttype_index > 0 {
@@ -186,18 +193,20 @@ unsafe fn read_encoded_offset(reader: &mut DwarfReader, encoding: u8) -> Result<
186193 if encoding == DW_EH_PE_omit || encoding & 0xF0 != 0 {
187194 return Err ( ( ) ) ;
188195 }
189- let result = match encoding & 0x0F {
190- // despite the name, LLVM also uses absptr for offsets instead of pointers
191- DW_EH_PE_absptr => reader. read :: < usize > ( ) ,
192- DW_EH_PE_uleb128 => reader. read_uleb128 ( ) as usize ,
193- DW_EH_PE_udata2 => reader. read :: < u16 > ( ) as usize ,
194- DW_EH_PE_udata4 => reader. read :: < u32 > ( ) as usize ,
195- DW_EH_PE_udata8 => reader. read :: < u64 > ( ) as usize ,
196- DW_EH_PE_sleb128 => reader. read_sleb128 ( ) as usize ,
197- DW_EH_PE_sdata2 => reader. read :: < i16 > ( ) as usize ,
198- DW_EH_PE_sdata4 => reader. read :: < i32 > ( ) as usize ,
199- DW_EH_PE_sdata8 => reader. read :: < i64 > ( ) as usize ,
200- _ => return Err ( ( ) ) ,
196+ let result = unsafe {
197+ match encoding & 0x0F {
198+ // despite the name, LLVM also uses absptr for offsets instead of pointers
199+ DW_EH_PE_absptr => reader. read :: < usize > ( ) ,
200+ DW_EH_PE_uleb128 => reader. read_uleb128 ( ) as usize ,
201+ DW_EH_PE_udata2 => reader. read :: < u16 > ( ) as usize ,
202+ DW_EH_PE_udata4 => reader. read :: < u32 > ( ) as usize ,
203+ DW_EH_PE_udata8 => reader. read :: < u64 > ( ) as usize ,
204+ DW_EH_PE_sleb128 => reader. read_sleb128 ( ) as usize ,
205+ DW_EH_PE_sdata2 => reader. read :: < i16 > ( ) as usize ,
206+ DW_EH_PE_sdata4 => reader. read :: < i32 > ( ) as usize ,
207+ DW_EH_PE_sdata8 => reader. read :: < i64 > ( ) as usize ,
208+ _ => return Err ( ( ) ) ,
209+ }
201210 } ;
202211 Ok ( result)
203212}
@@ -250,14 +259,14 @@ unsafe fn read_encoded_pointer(
250259 if encoding & 0x0F != DW_EH_PE_absptr {
251260 return Err ( ( ) ) ;
252261 }
253- reader. read :: < * const u8 > ( )
262+ unsafe { reader. read :: < * const u8 > ( ) }
254263 } else {
255- let offset = read_encoded_offset ( reader, encoding & 0x0F ) ?;
264+ let offset = unsafe { read_encoded_offset ( reader, encoding & 0x0F ) ? } ;
256265 base_ptr. wrapping_add ( offset)
257266 } ;
258267
259268 if encoding & DW_EH_PE_indirect != 0 {
260- ptr = * ( ptr. cast :: < * const u8 > ( ) ) ;
269+ ptr = unsafe { * ( ptr. cast :: < * const u8 > ( ) ) } ;
261270 }
262271
263272 Ok ( ptr)
0 commit comments