summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNiko Kiirala <niko@kiirala.com>2009-05-16 20:38:23 +0000
committerkiirala <kiirala@users.sourceforge.net>2009-05-16 20:38:23 +0000
commitbc91e98745a48ad42690c85ff72083624c972e80 (patch)
tree7eac09acc5c91f2e15fa78cc9c5f1b266817c527 /src
parent* Typo fixed, thanks to Kris (Closes: #377357) (diff)
downloadinkscape-bc91e98745a48ad42690c85ff72083624c972e80.tar.gz
inkscape-bc91e98745a48ad42690c85ff72083624c972e80.zip
Fixed dangling pointers and possible memory leaks with feImage
(bzr r7889)
Diffstat (limited to 'src')
-rw-r--r--src/display/nr-filter-image.cpp22
-rw-r--r--src/filters/image.cpp1
2 files changed, 14 insertions, 9 deletions
diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
index b50a66086..625aadf80 100644
--- a/src/display/nr-filter-image.cpp
+++ b/src/display/nr-filter-image.cpp
@@ -23,12 +23,12 @@
namespace Inkscape {
namespace Filters {
-FilterImage::FilterImage()
-{
- feImageHref=NULL;
- image_pixbuf=NULL;
- document=NULL;
-}
+FilterImage::FilterImage() :
+ SVGElem(0),
+ document(0),
+ feImageHref(0),
+ image_pixbuf(0)
+{ }
FilterPrimitive * FilterImage::create() {
return new FilterImage();
@@ -37,6 +37,7 @@ FilterPrimitive * FilterImage::create() {
FilterImage::~FilterImage()
{
if (feImageHref) g_free(feImageHref);
+ if (image_pixbuf) g_free(image_pixbuf);
}
int FilterImage::render(FilterSlot &slot, FilterUnits const &units) {
@@ -55,7 +56,7 @@ int FilterImage::render(FilterSlot &slot, FilterUnits const &units) {
NRArenaItem* ai = sp_item_invoke_show(SVGElem, arena, key, SP_ITEM_SHOW_DISPLAY);
if (!ai) {
g_warning("feImage renderer: error creating NRArenaItem for SVG Element");
- g_free(arena);
+ nr_object_unref((NRObject *) arena);
return 0;
}
pb = new NRPixBlock;
@@ -99,7 +100,7 @@ int FilterImage::render(FilterSlot &slot, FilterUnits const &units) {
{
g_warning("FilterImage::render: not enough memory to create pixel buffer. Need %ld.", 4L * width * height);
}
- nr_arena_item_unref(ai);
+ sp_item_invoke_hide(SVGElem, key);
nr_object_unref((NRObject *) arena);
}
@@ -202,7 +203,10 @@ int FilterImage::render(FilterSlot &slot, FilterUnits const &units) {
}
}
}
- if (free_pb_on_exit) nr_pixblock_release(pb);
+ if (free_pb_on_exit) {
+ nr_pixblock_release(pb);
+ delete pb;
+ }
out->empty = FALSE;
slot.set(_output, out);
diff --git a/src/filters/image.cpp b/src/filters/image.cpp
index eda815d8d..a23ffeee4 100644
--- a/src/filters/image.cpp
+++ b/src/filters/image.cpp
@@ -150,6 +150,7 @@ sp_feImage_set(SPObject *object, unsigned int key, gchar const *value)
if (!feImage->href) return;
try{
Inkscape::URI SVGElem_uri(feImage->href);
+ delete feImage->SVGElemRef;
feImage->SVGElemRef = new Inkscape::URIReference(feImage->document);
feImage->from_element = true;
feImage->SVGElemRef->attach(SVGElem_uri);