From fcb41542c3a113a99b1821e249e5ffcc9c80c873 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bennet=20Ble=C3=9Fmann?= Date: Sat, 6 Jul 2024 14:01:51 +0200 Subject: [PATCH] fix stream.rs UB --- src/arena.rs | 34 +++++++++++++++++++--------------- src/machine/arithmetic_ops.rs | 1 - src/machine/gc.rs | 1 - src/machine/mock_wam.rs | 2 -- tests/scryer/issues.rs | 2 +- tests/scryer/src_tests.rs | 20 ++++++++++---------- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/arena.rs b/src/arena.rs index 84e02e84..e0cdeef9 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -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>) { + drop(unsafe { Box::from_raw(ptr.as_ptr()) }); + } } #[derive(Debug)] @@ -655,9 +662,7 @@ impl Arena { unsafe fn drop_slab_in_place(value: NonNull) { macro_rules! drop_typed_slab_in_place { ($payload: ty, $value: expr) => { - drop(Box::from_raw( - $value.as_ptr().cast::>(), - )); + <$payload as ArenaAllocated>::dealloc($value.cast::>()) }; } @@ -669,34 +674,34 @@ unsafe fn drop_slab_in_place(value: NonNull) { drop_typed_slab_in_place!(Rational, value); } ArenaHeaderTag::InputFileStream => { - drop_typed_slab_in_place!(InputFileStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::OutputFileStream => { - drop_typed_slab_in_place!(OutputFileStream, value); + drop_typed_slab_in_place!(StreamLayout, value); } ArenaHeaderTag::NamedTcpStream => { - drop_typed_slab_in_place!(NamedTcpStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::NamedTlsStream => { #[cfg(feature = "tls")] - drop_typed_slab_in_place!(NamedTlsStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::HttpReadStream => { #[cfg(feature = "http")] - drop_typed_slab_in_place!(HttpReadStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::HttpWriteStream => { #[cfg(feature = "http")] - drop_typed_slab_in_place!(HttpWriteStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::ReadlineStream => { - drop_typed_slab_in_place!(ReadlineStream, value); + drop_typed_slab_in_place!(StreamLayout, value); } ArenaHeaderTag::StaticStringStream => { - drop_typed_slab_in_place!(StaticStringStream, value); + drop_typed_slab_in_place!(StreamLayout, value); } ArenaHeaderTag::ByteStream => { - drop_typed_slab_in_place!(ByteStream, value); + drop_typed_slab_in_place!(StreamLayout>, value); } ArenaHeaderTag::LiveLoadState | ArenaHeaderTag::InactiveLoadState => { drop_typed_slab_in_place!(LiveLoadState, value); @@ -714,10 +719,10 @@ unsafe fn drop_slab_in_place(value: NonNull) { drop_typed_slab_in_place!(HttpResponse, value); } ArenaHeaderTag::StandardOutputStream => { - drop_typed_slab_in_place!(StandardOutputStream, value); + drop_typed_slab_in_place!(StreamLayout, value); } ArenaHeaderTag::StandardErrorStream => { - drop_typed_slab_in_place!(StandardErrorStream, value); + drop_typed_slab_in_place!(StreamLayout, 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")] diff --git a/src/machine/arithmetic_ops.rs b/src/machine/arithmetic_ops.rs index 498eb036..0ab17712 100644 --- a/src/machine/arithmetic_ops.rs +++ b/src/machine/arithmetic_ops.rs @@ -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(); diff --git a/src/machine/gc.rs b/src/machine/gc.rs index f62231ea..32142e1d 100644 --- a/src/machine/gc.rs +++ b/src/machine/gc.rs @@ -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(); diff --git a/src/machine/mock_wam.rs b/src/machine/mock_wam.rs index 2679be43..0da42e08 100644 --- a/src/machine/mock_wam.rs +++ b/src/machine/mock_wam.rs @@ -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(); diff --git a/tests/scryer/issues.rs b/tests/scryer/issues.rs index 556bf9d5..40e3f5ce 100644 --- a/tests/scryer/issues.rs +++ b/tests/scryer/issues.rs @@ -4,7 +4,7 @@ use serial_test::serial; // issue #831 #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn call_0() { load_module_test( "tests-pl/issue831-call0.pl", diff --git a/tests/scryer/src_tests.rs b/tests/scryer/src_tests.rs index a3d6ddbf..2434cb1f 100644 --- a/tests/scryer/src_tests.rs +++ b/tests/scryer/src_tests.rs @@ -3,35 +3,35 @@ use serial_test::serial; #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn builtins() { load_module_test("src/tests/builtins.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn call_with_inference_limit() { load_module_test("src/tests/call_with_inference_limit.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn facts() { load_module_test("src/tests/facts.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn hello_world() { load_module_test("src/tests/hello_world.pl", "Hello World!\n"); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn syntax_error() { load_module_test( "tests-pl/syntax_error.pl", @@ -41,21 +41,21 @@ fn syntax_error() { #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn predicates() { load_module_test("src/tests/predicates.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn rules() { load_module_test("src/tests/rules.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn setup_call_cleanup_load() { load_module_test( "src/tests/setup_call_cleanup.pl", @@ -65,14 +65,14 @@ fn setup_call_cleanup_load() { #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn clpz_load() { load_module_test("src/tests/clpz/test_clpz.pl", ""); } #[serial] #[test] -#[cfg_attr(miri, ignore = "blocked on streams.rs UB")] +#[cfg_attr(miri, ignore = "blocked on helper.rs UB")] fn iso_conformity_tests() { load_module_test("tests-pl/iso-conformity-tests.pl", "All tests passed"); } -- 2.54.0