11
11
12
12
#![ allow( non_upper_case_globals) ]
13
13
#![ allow( unused) ]
14
+ #![ forbid( unsafe_op_in_unsafe_fn) ]
14
15
15
16
use super :: DwarfReader ;
16
17
use core:: mem;
@@ -70,45 +71,51 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
70
71
71
72
let func_start = context. func_start ;
72
73
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
+ }
80
82
} ;
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
+ }
81
89
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
+ } ;
91
96
let ip = context. ip ;
92
97
93
98
if !USING_SJLJ_EXCEPTIONS {
94
99
// read the callsite table
95
100
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
+ }
112
119
}
113
120
}
114
121
}
@@ -125,15 +132,15 @@ pub unsafe fn find_eh_action(lsda: *const u8, context: &EHContext<'_>) -> Result
125
132
}
126
133
let mut idx = ip. addr ( ) ;
127
134
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 ( ) } ;
130
137
idx -= 1 ;
131
138
if idx == 0 {
132
139
// Can never have null landing pad for sjlj -- that would have
133
140
// been indicated by a -1 call site index.
134
141
// FIXME(strict provenance)
135
142
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) } ) ;
137
144
}
138
145
}
139
146
}
@@ -151,9 +158,9 @@ unsafe fn interpret_cs_action(
151
158
} else {
152
159
// If lpad != 0 and cs_action_entry != 0, we have to check ttype_index.
153
160
// 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 ) } ;
155
162
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 ( ) } ;
157
164
if ttype_index == 0 {
158
165
EHAction :: Cleanup ( lpad)
159
166
} else if ttype_index > 0 {
@@ -186,18 +193,20 @@ unsafe fn read_encoded_offset(reader: &mut DwarfReader, encoding: u8) -> Result<
186
193
if encoding == DW_EH_PE_omit || encoding & 0xF0 != 0 {
187
194
return Err ( ( ) ) ;
188
195
}
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
+ }
201
210
} ;
202
211
Ok ( result)
203
212
}
@@ -250,14 +259,14 @@ unsafe fn read_encoded_pointer(
250
259
if encoding & 0x0F != DW_EH_PE_absptr {
251
260
return Err ( ( ) ) ;
252
261
}
253
- reader. read :: < * const u8 > ( )
262
+ unsafe { reader. read :: < * const u8 > ( ) }
254
263
} else {
255
- let offset = read_encoded_offset ( reader, encoding & 0x0F ) ?;
264
+ let offset = unsafe { read_encoded_offset ( reader, encoding & 0x0F ) ? } ;
256
265
base_ptr. wrapping_add ( offset)
257
266
} ;
258
267
259
268
if encoding & DW_EH_PE_indirect != 0 {
260
- ptr = * ( ptr. cast :: < * const u8 > ( ) ) ;
269
+ ptr = unsafe { * ( ptr. cast :: < * const u8 > ( ) ) } ;
261
270
}
262
271
263
272
Ok ( ptr)
0 commit comments