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 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 } 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);