]> Repositorios git - scryer-prolog.git/commitdiff
fix stream.rs UB
authorBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 12:01:51 +0000 (14:01 +0200)
committerBennet Bleßmann <[email protected]>
Sat, 6 Jul 2024 12:30:03 +0000 (14:30 +0200)
src/arena.rs
src/machine/arithmetic_ops.rs
src/machine/gc.rs
src/machine/mock_wam.rs
tests/scryer/issues.rs
tests/scryer/src_tests.rs

index 84e02e84d2f2c7d6a01b245a769eaff1471b9eef..e0cdeef9c3026322b5194de18165489c2a96cf8b 100644 (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")]
index 498eb036f4e86acd38812b4a6932b64399c80d4c..0ab1771242dfc3e07fd10148b073871df4c4e496 100644 (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();
index f62231ea6529f6a53f282d92db11680734792318..32142e1ddb67bf597ff4c9ec766b8c51f63eaaaf 100644 (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();
 
index 2679be43b855c1495074bdf52d0946632d7626f1..0da42e08d55ad1542f491fbc2eab858f3aea145c 100644 (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();
index 556bf9d5b21dbfa047021ecfaa2e0ff4851f3e1f..40e3f5ce3d13e9ca257e6ff3a66a43ba68bf8e48 100644 (file)
@@ -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",
index a3d6ddbf5214fed8f3fe2baae62b7ab37cd707fa..2434cb1fd9bd273b200a6fc38aff7b84d7e19520 100644 (file)
@@ -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");
 }