fix stream.rs UB

This commit is contained in:
Bennet Bleßmann
2024-07-06 14:01:51 +02:00
parent 87b4c9d736
commit fcb41542c3
6 changed files with 30 additions and 30 deletions

View File

@@ -5,6 +5,7 @@ use crate::http::{HttpListener, HttpResponse};
use crate::machine::loader::LiveLoadState;
use crate::machine::machine_indices::*;
use crate::machine::streams::*;
use crate::parser::char_reader::CharReader;
use crate::raw_block::*;
use crate::rcu::Rcu;
use crate::rcu::RcuRef;
@@ -369,6 +370,12 @@ pub trait ArenaAllocated: Sized {
allocated_ptr
}
/// # Safety
/// - ptr points to an allocated slab of the correct kind
unsafe fn dealloc(ptr: NonNull<TypedAllocSlab<Self>>) {
drop(unsafe { Box::from_raw(ptr.as_ptr()) });
}
}
#[derive(Debug)]
@@ -655,9 +662,7 @@ impl Arena {
unsafe fn drop_slab_in_place(value: NonNull<AllocSlab>) {
macro_rules! drop_typed_slab_in_place {
($payload: ty, $value: expr) => {
drop(Box::from_raw(
$value.as_ptr().cast::<TypedAllocSlab<$payload>>(),
));
<$payload as ArenaAllocated>::dealloc($value.cast::<TypedAllocSlab<$payload>>())
};
}
@@ -669,34 +674,34 @@ unsafe fn drop_slab_in_place(value: NonNull<AllocSlab>) {
drop_typed_slab_in_place!(Rational, value);
}
ArenaHeaderTag::InputFileStream => {
drop_typed_slab_in_place!(InputFileStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<InputFileStream>>, value);
}
ArenaHeaderTag::OutputFileStream => {
drop_typed_slab_in_place!(OutputFileStream, value);
drop_typed_slab_in_place!(StreamLayout<OutputFileStream>, value);
}
ArenaHeaderTag::NamedTcpStream => {
drop_typed_slab_in_place!(NamedTcpStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<NamedTcpStream>>, value);
}
ArenaHeaderTag::NamedTlsStream => {
#[cfg(feature = "tls")]
drop_typed_slab_in_place!(NamedTlsStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<NamedTlsStream>>, value);
}
ArenaHeaderTag::HttpReadStream => {
#[cfg(feature = "http")]
drop_typed_slab_in_place!(HttpReadStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<HttpReadStream>>, value);
}
ArenaHeaderTag::HttpWriteStream => {
#[cfg(feature = "http")]
drop_typed_slab_in_place!(HttpWriteStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<HttpWriteStream>>, value);
}
ArenaHeaderTag::ReadlineStream => {
drop_typed_slab_in_place!(ReadlineStream, value);
drop_typed_slab_in_place!(StreamLayout<ReadlineStream>, value);
}
ArenaHeaderTag::StaticStringStream => {
drop_typed_slab_in_place!(StaticStringStream, value);
drop_typed_slab_in_place!(StreamLayout<StaticStringStream>, value);
}
ArenaHeaderTag::ByteStream => {
drop_typed_slab_in_place!(ByteStream, value);
drop_typed_slab_in_place!(StreamLayout<CharReader<ByteStream>>, value);
}
ArenaHeaderTag::LiveLoadState | ArenaHeaderTag::InactiveLoadState => {
drop_typed_slab_in_place!(LiveLoadState, value);
@@ -714,10 +719,10 @@ unsafe fn drop_slab_in_place(value: NonNull<AllocSlab>) {
drop_typed_slab_in_place!(HttpResponse, value);
}
ArenaHeaderTag::StandardOutputStream => {
drop_typed_slab_in_place!(StandardOutputStream, value);
drop_typed_slab_in_place!(StreamLayout<StandardOutputStream>, value);
}
ArenaHeaderTag::StandardErrorStream => {
drop_typed_slab_in_place!(StandardErrorStream, value);
drop_typed_slab_in_place!(StreamLayout<StandardErrorStream>, value);
}
ArenaHeaderTag::NullStream
| ArenaHeaderTag::IndexPtrUndefined
@@ -778,7 +783,6 @@ mod tests {
}
#[test]
#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn heap_cell_value_const_cast() {
let mut wam = MockWAM::new();
#[cfg(target_pointer_width = "32")]

View File

@@ -1415,7 +1415,6 @@ mod tests {
use crate::machine::mock_wam::*;
#[test]
#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn arith_eval_by_metacall_tests() {
let mut wam = MachineState::new();
let mut op_dir = default_op_dir();

View File

@@ -369,7 +369,6 @@ mod tests {
use crate::machine::mock_wam::*;
#[test]
#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn heap_marking_tests() {
let mut wam = MockWAM::new();

View File

@@ -260,7 +260,6 @@ mod tests {
use super::*;
#[test]
#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn unify_tests() {
let mut wam = MachineState::new();
let mut op_dir = default_op_dir();
@@ -482,7 +481,6 @@ mod tests {
}
#[test]
#[cfg_attr(miri, ignore = "blocked on streams.rs UB")]
fn test_unify_with_occurs_check() {
let mut wam = MachineState::new();
let mut op_dir = default_op_dir();