diff options
| author | Niko Kiirala <niko@kiirala.com> | 2009-05-16 20:38:23 +0000 |
|---|---|---|
| committer | kiirala <kiirala@users.sourceforge.net> | 2009-05-16 20:38:23 +0000 |
| commit | bc91e98745a48ad42690c85ff72083624c972e80 (patch) | |
| tree | 7eac09acc5c91f2e15fa78cc9c5f1b266817c527 /src | |
| parent | * Typo fixed, thanks to Kris (Closes: #377357) (diff) | |
| download | inkscape-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.cpp | 22 | ||||
| -rw-r--r-- | src/filters/image.cpp | 1 |
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); |
