From 93e7d98275f7a1bf057d4f5138791eff3c81611d Mon Sep 17 00:00:00 2001 From: cilix42 Date: Fri, 22 Feb 2008 10:18:37 +0000 Subject: [PATCH] Don't crash when the original of an SPUse can't be found. This sort of fixes LP 185734, but maybe further action would be appropriate (e.g., should we remove orphaned items from the xml tree in the first place?). --- src/object-snapper.cpp | 2 ++ src/sp-use.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index e320f013f..0308efe2d 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -166,6 +166,7 @@ void Inkscape::ObjectSnapper::_collectNodes(Inkscape::Snapper::PointType const & if (SP_IS_USE(*i)) { root_item = sp_use_root(SP_USE(*i)); } + g_return_if_fail(root_item); //Collect all nodes so we can snap to them if (_snap_to_itemnode) { @@ -271,6 +272,7 @@ void Inkscape::ObjectSnapper::_collectPaths(Inkscape::Snapper::PointType const & if (SP_IS_USE(*i)) { i2doc = sp_use_get_root_transform(SP_USE(*i)); root_item = sp_use_root(SP_USE(*i)); + g_return_if_fail(root_item); } else { i2doc = sp_item_i2doc_affine(*i); root_item = *i; diff --git a/src/sp-use.cpp b/src/sp-use.cpp index dc1774e3d..590103d36 100644 --- a/src/sp-use.cpp +++ b/src/sp-use.cpp @@ -372,7 +372,8 @@ sp_use_hide(SPItem *item, unsigned key) /** * Returns the ultimate original of a SPUse (i.e. the first object in the chain of its originals - * which is not an SPUse). + * which is not an SPUse). If no original is found, NULL is returned (it is the responsibility + * of the caller to make sure that this is handled correctly). * * Note that the returned is the clone object, i.e. the child of an SPUse (of the argument one for * the trivial case) and not the "true original". @@ -384,7 +385,7 @@ sp_use_root(SPUse *use) while (SP_IS_USE(orig)) { orig = SP_USE(orig)->child; } - g_assert(SP_IS_ITEM(orig)); + g_return_val_if_fail(SP_IS_ITEM(orig), NULL); return SP_ITEM(orig); } @@ -663,6 +664,7 @@ sp_use_unlink(SPUse *use) // Track the ultimate source of a chain of uses. SPItem *orig = sp_use_root(use); + g_return_val_if_fail(orig, NULL); // Calculate the accumulated transform, starting from the original. NR::Matrix t = sp_use_get_root_transform(use); @@ -742,6 +744,7 @@ sp_use_snappoints(SPItem const *item, SnapPointsIter p) SPUse *use = SP_USE(item); SPItem *root = sp_use_root(use); + g_return_if_fail(root); SPItemClass const &item_class = *(SPItemClass const *) G_OBJECT_GET_CLASS(root); if (item_class.snappoints) { -- 2.30.2