Skip to content

Commit ef516aa

Browse files
std: unsafe-wrap personality::dwarf::eh
1 parent 92c6c03 commit ef516aa

File tree

1 file changed

+61
-52
lines changed
  • library/std/src/sys/personality/dwarf

1 file changed

+61
-52
lines changed

library/std/src/sys/personality/dwarf/eh.rs

+61-52
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
1212
#![allow(non_upper_case_globals)]
1313
#![allow(unused)]
14+
#![forbid(unsafe_op_in_unsafe_fn)]
1415

1516
use super::DwarfReader;
1617
use 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

Comments
 (0)