From 245aad34c8bb6dcbcbbc25dcffaeb611fdc10e57 Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 12:53:02 +0000 Subject: [PATCH 1/3] free everything in tests --- rtree-capi/tests/test.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rtree-capi/tests/test.c b/rtree-capi/tests/test.c index 1743eb7..5e28876 100644 --- a/rtree-capi/tests/test.c +++ b/rtree-capi/tests/test.c @@ -199,6 +199,7 @@ bool test_nodes(void) { rtree_free(tree); return false; } + rtree_node_children_free(child1children, nchild1children); rtree_node_children_free(children, nchildren); rtree_node_free(root); @@ -225,6 +226,8 @@ bool test_root_node_id(void) { rtree_free(tree); return false; } + rtree_node_free(root); + rtree_free(tree); return true; } @@ -372,6 +375,7 @@ bool test_rtree_node_1d(void) { rtree_free(tree); return false; } + rtree_node_children_free(child1children, nchild1children); rtree_node_children_free(children, nchildren); rtree_node_free(root); From 1729df52f52998cbd296e4763e974b27de4ba852 Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 13:39:44 +0000 Subject: [PATCH 2/3] add valgrind to test workflow --- .github/workflows/test.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9fd45e0..e352d7b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,3 +20,15 @@ jobs: run: cargo build --verbose - name: Run tests run: cargo test --verbose + - name: Install Valgrind + run: sudo apt-get update && sudo apt-get install -y valgrind + - name: memcheck + run: | + cargo test -p rtree-capi c_api -- --nocapture + LD_LIBRARY_PATH=target/debug valgrind \ + --tool=memcheck \ + --leak-check=full \ + --show-leak-kinds=all \ + --track-origins=yes \ + --error-exitcode=99 \ + target/debug/test_c_api From 1b239f886354da5f30fe656975fa34de37c6351c Mon Sep 17 00:00:00 2001 From: Leo Collins Date: Mon, 23 Mar 2026 13:42:03 +0000 Subject: [PATCH 3/3] fix memory leak in `node_children_free` --- rtree-capi/src/node.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rtree-capi/src/node.rs b/rtree-capi/src/node.rs index 3a89ec2..d366c98 100644 --- a/rtree-capi/src/node.rs +++ b/rtree-capi/src/node.rs @@ -147,6 +147,11 @@ pub extern "C" fn rtree_node_children_free(children: *mut *mut RTreeNodeH, n: us if children.is_null() { return RTreeError::NullPointer; } - drop(unsafe { Vec::from_raw_parts(children, n, n) }); + let child_ptrs = unsafe { Vec::from_raw_parts(children, n, n) }; + for child in child_ptrs { + if !child.is_null() { + drop(unsafe { Box::from_raw(child as *mut NodeRef) }); + } + } RTreeError::Success }