From fe33599f4695c4ab442e1e5f8682cfda11321308 Mon Sep 17 00:00:00 2001 From: Aleksei Bavshin Date: Tue, 22 Mar 2022 22:47:21 -0700 Subject: [PATCH] lib: fix incorrect int ptr cast on big-endian architectures `*usize` -> `*u32` conversion on 64-bit big-endian machine takes high halfword of the value. As a consequence, any result returned via `count` is unexpectedly shifted left: u32 = 00 00 00 01 // 1 usize = 00 00 00 01 00 00 00 00 // 4294967296 Fixes following test failure: ``` $ cargo test -- tests::corpus_test <...> running 13 tests memory allocation of 206158430208 bytes failed error: test failed, to rerun pass '--lib' ``` --- lib/binding_rust/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/binding_rust/lib.rs b/binding_rust/lib.rs index e88a411c..1df9e7ac 100644 --- a/binding_rust/lib.rs +++ b/binding_rust/lib.rs @@ -705,14 +705,14 @@ impl Tree { /// after calling one of the [Parser::parse] functions. Call it on the old tree that /// was passed to parse, and pass the new tree that was returned from `parse`. pub fn changed_ranges(&self, other: &Tree) -> impl ExactSizeIterator { - let mut count = 0; + let mut count = 0u32; unsafe { let ptr = ffi::ts_tree_get_changed_ranges( self.0.as_ptr(), other.0.as_ptr(), - &mut count as *mut _ as *mut u32, + &mut count as *mut u32, ); - util::CBufferIter::new(ptr, count).map(|r| r.into()) + util::CBufferIter::new(ptr, count as usize).map(|r| r.into()) } } } -- 2.35.1