From 2d3ddca130d7d023daedf77a6ab58fefec510292 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Wed, 29 Aug 2018 16:26:44 -0500 Subject: [PATCH] gitlab#325 - rsvg_tree_free(): Cast the tree to our real Tree so it will get dropped We had this: pub extern "C" fn rsvg_tree_free(tree: *mut RsvgTree) { if !tree.is_null() { let _ = unsafe { Box::from_raw(tree) }; ^ gets a Box, which is a box of a zero-sized enum I.e. it frees zero bytes :) With need this rebinding: let tree = unsafe { &mut *(tree as *mut Tree) }; i.e. cast tree as *mut Tree, so we'll end up with a Box which *can* be dropped as appropriate. https://gitlab.gnome.org/GNOME/librsvg/issues/325 --- rsvg_internals/src/tree.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rsvg_internals/src/tree.rs b/rsvg_internals/src/tree.rs index 2fb8a753..2c68e8f6 100644 --- a/rsvg_internals/src/tree.rs +++ b/rsvg_internals/src/tree.rs @@ -42,6 +42,7 @@ pub extern "C" fn rsvg_tree_new(root: *const RsvgNode) -> *mut RsvgTree { #[no_mangle] pub extern "C" fn rsvg_tree_free(tree: *mut RsvgTree) { if !tree.is_null() { + let tree = unsafe { &mut *(tree as *mut Tree) }; let _ = unsafe { Box::from_raw(tree) }; } } -- GitLab