configure.ac | 1 src/lib/VSDXMLHelper.cpp | 20 +++ src/lib/VSDXMLHelper.h | 5 src/lib/VSDXMLParserBase.cpp | 216 +++++++++++++++---------------------------- src/lib/VSDXParser.cpp | 165 +++++++++++++------------------- src/lib/VSDXTheme.cpp | 11 +- src/lib/libvisio_utils.h | 4 7 files changed, 182 insertions(+), 240 deletions(-)
New commits: commit 5e0cf3b1972fa26d28209a828933d2a6f95b49b1 Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 17:43:42 2015 +0200 avoid memory leak Change-Id: Ibd1e042f11f0191bda0a4ae3064df603137fe5ba diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index 23c9778..12fe447 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -1197,8 +1197,8 @@ void libvisio::VSDXMLParserBase::readCharIX(xmlTextReaderPtr reader) case XML_FONT: if (XML_READER_TYPE_ELEMENT == tokenType) { - xmlChar *stringValue = readStringData(reader); - if (stringValue && !xmlStrEqual(stringValue, BAD_CAST("Themed"))) + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); + if (stringValue && !xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) { try { @@ -1207,11 +1207,11 @@ void libvisio::VSDXMLParserBase::readCharIX(xmlTextReaderPtr reader) if (iter != m_fonts.end()) font = iter->second; else - font = VSDName(librevenge::RVNGBinaryData(stringValue, xmlStrlen(stringValue)), VSD_TEXT_UTF8); + font = VSDName(librevenge::RVNGBinaryData(stringValue.get(), xmlStrlen(stringValue.get())), VSD_TEXT_UTF8); } catch (const XmlParserException &) { - font = VSDName(librevenge::RVNGBinaryData(stringValue, xmlStrlen(stringValue)), VSD_TEXT_UTF8); + font = VSDName(librevenge::RVNGBinaryData(stringValue.get(), xmlStrlen(stringValue.get())), VSD_TEXT_UTF8); } } } commit 13eba01e48420e17525f271a0b1f9124fd22a8a2 Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 17:41:52 2015 +0200 fix more string leaks Change-Id: Ifc79cf5d91a262fb4d51d13d9d183164ccc24f07 diff --git a/src/lib/VSDXTheme.cpp b/src/lib/VSDXTheme.cpp index 85cf0ac..f962105 100644 --- a/src/lib/VSDXTheme.cpp +++ b/src/lib/VSDXTheme.cpp @@ -8,9 +8,14 @@ */ #include "VSDXTheme.h" + +#include <boost/shared_ptr.hpp> + #include "VSDXMLTokenMap.h" #include "libvisio_utils.h" +using boost::shared_ptr; + libvisio::VSDXVariationClrScheme::VSDXVariationClrScheme() : m_varColor1() , m_varColor2() @@ -96,7 +101,7 @@ boost::optional<libvisio::Colour> libvisio::VSDXTheme::readSrgbClr(xmlTextReader boost::optional<libvisio::Colour> retVal; if (XML_A_SRGBCLR == getElementToken(reader)) { - xmlChar *val = xmlTextReaderGetAttribute(reader, BAD_CAST("val")); + const shared_ptr<xmlChar> val(xmlTextReaderGetAttribute(reader, BAD_CAST("val")), xmlFree); if (val) { try @@ -106,7 +111,6 @@ boost::optional<libvisio::Colour> libvisio::VSDXTheme::readSrgbClr(xmlTextReader catch (const XmlParserException &) { } - xmlFree(val); } } return retVal; @@ -117,7 +121,7 @@ boost::optional<libvisio::Colour> libvisio::VSDXTheme::readSysClr(xmlTextReaderP boost::optional<libvisio::Colour> retVal; if (XML_A_SYSCLR == getElementToken(reader)) { - xmlChar *lastClr = xmlTextReaderGetAttribute(reader, BAD_CAST("lastClr")); + const shared_ptr<xmlChar> lastClr(xmlTextReaderGetAttribute(reader, BAD_CAST("lastClr")), xmlFree); if (lastClr) { try @@ -127,7 +131,6 @@ boost::optional<libvisio::Colour> libvisio::VSDXTheme::readSysClr(xmlTextReaderP catch (const XmlParserException &) { } - xmlFree(lastClr); } } return retVal; commit 5409f4e852318f59fc59bf56701205095954073b Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 17:39:28 2015 +0200 avoid a slew of string leaks Change-Id: I72b02e1752df97501a0c1a5aef123f7f43dcdd2f diff --git a/src/lib/VSDXMLHelper.cpp b/src/lib/VSDXMLHelper.cpp index 4180316..582763e 100644 --- a/src/lib/VSDXMLHelper.cpp +++ b/src/lib/VSDXMLHelper.cpp @@ -120,6 +120,11 @@ libvisio::Colour libvisio::xmlStringToColour(const xmlChar *s) return Colour((val & 0xff0000) >> 16, (val & 0xff00) >> 8, val & 0xff, 0); } +libvisio::Colour libvisio::xmlStringToColour(const boost::shared_ptr<xmlChar> &s) +{ + return xmlStringToColour(s.get()); +} + long libvisio::xmlStringToLong(const xmlChar *s) { using boost::lexical_cast; @@ -139,6 +144,11 @@ long libvisio::xmlStringToLong(const xmlChar *s) return 0; } +long libvisio::xmlStringToLong(const boost::shared_ptr<xmlChar> &s) +{ + return xmlStringToLong(s.get()); +} + double libvisio::xmlStringToDouble(const xmlChar *s) try { if (xmlStrEqual(s, BAD_CAST("Themed"))) @@ -152,6 +162,11 @@ catch (const boost::bad_lexical_cast &) throw XmlParserException(); } +double libvisio::xmlStringToDouble(const boost::shared_ptr<xmlChar> &s) +{ + return xmlStringToDouble(s.get()); +} + bool libvisio::xmlStringToBool(const xmlChar *s) { if (xmlStrEqual(s, BAD_CAST("Themed"))) @@ -171,6 +186,11 @@ bool libvisio::xmlStringToBool(const xmlChar *s) } +bool libvisio::xmlStringToBool(const boost::shared_ptr<xmlChar> &s) +{ + return xmlStringToBool(s.get()); +} + // VSDXRelationship libvisio::VSDXRelationship::VSDXRelationship(xmlTextReaderPtr reader) diff --git a/src/lib/VSDXMLHelper.h b/src/lib/VSDXMLHelper.h index bf14baa..588ca50 100644 --- a/src/lib/VSDXMLHelper.h +++ b/src/lib/VSDXMLHelper.h @@ -12,6 +12,7 @@ #include <map> #include <string> +#include <boost/shared_ptr.hpp> #include <librevenge-stream/librevenge-stream.h> #include <libxml/xmlreader.h> #include "VSDTypes.h" @@ -28,12 +29,16 @@ xmlTextReaderPtr xmlReaderForStream(librevenge::RVNGInputStream *input, int options); Colour xmlStringToColour(const xmlChar *s); +Colour xmlStringToColour(const boost::shared_ptr<xmlChar> &s); long xmlStringToLong(const xmlChar *s); +long xmlStringToLong(const boost::shared_ptr<xmlChar> &s); double xmlStringToDouble(const xmlChar *s); +double xmlStringToDouble(const boost::shared_ptr<xmlChar> &s); bool xmlStringToBool(const xmlChar *s); +bool xmlStringToBool(const boost::shared_ptr<xmlChar> &s); class VSDCollector; diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index 8b6d204..23c9778 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -21,6 +21,7 @@ #include "VSDXMLHelper.h" #include "VSDXMLTokenMap.h" +using boost::shared_ptr; libvisio::VSDXMLParserBase::VSDXMLParserBase() : m_collector(), m_stencils(), m_currentStencil(0), m_shape(), @@ -55,7 +56,7 @@ void libvisio::VSDXMLParserBase::readGeometry(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) @@ -63,7 +64,6 @@ void libvisio::VSDXMLParserBase::readGeometry(xmlTextReaderPtr reader) m_currentGeometryList->clear(); m_shape.m_geometries.erase(ix); } - xmlFree(delString); } return; } @@ -176,12 +176,11 @@ void libvisio::VSDXMLParserBase::readMoveTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -227,12 +226,11 @@ void libvisio::VSDXMLParserBase::readLineTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -278,12 +276,11 @@ void libvisio::VSDXMLParserBase::readArcTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -333,12 +330,11 @@ void libvisio::VSDXMLParserBase::readEllipticalArcTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -400,12 +396,11 @@ void libvisio::VSDXMLParserBase::readEllipse(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -467,12 +462,11 @@ void libvisio::VSDXMLParserBase::readNURBSTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -539,12 +533,11 @@ void libvisio::VSDXMLParserBase::readPolylineTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -594,12 +587,11 @@ void libvisio::VSDXMLParserBase::readInfiniteLine(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -653,12 +645,11 @@ void libvisio::VSDXMLParserBase::readRelEllipticalArcTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -720,12 +711,11 @@ void libvisio::VSDXMLParserBase::readRelCubBezTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -787,12 +777,11 @@ void libvisio::VSDXMLParserBase::readRelLineTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -838,12 +827,11 @@ void libvisio::VSDXMLParserBase::readRelMoveTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -889,12 +877,11 @@ void libvisio::VSDXMLParserBase::readRelQuadBezTo(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -942,12 +929,12 @@ void libvisio::VSDXMLParserBase::readShape(xmlTextReaderPtr reader) m_isShapeStarted = true; m_currentShapeLevel = getElementDepth(reader); - xmlChar *idString = xmlTextReaderGetAttribute(reader, BAD_CAST("ID")); - xmlChar *masterPageString = xmlTextReaderGetAttribute(reader, BAD_CAST("Master")); - xmlChar *masterShapeString = xmlTextReaderGetAttribute(reader, BAD_CAST("MasterShape")); - xmlChar *lineStyleString = xmlTextReaderGetAttribute(reader, BAD_CAST("LineStyle")); - xmlChar *fillStyleString = xmlTextReaderGetAttribute(reader, BAD_CAST("FillStyle")); - xmlChar *textStyleString = xmlTextReaderGetAttribute(reader, BAD_CAST("TextStyle")); + const shared_ptr<xmlChar> idString(xmlTextReaderGetAttribute(reader, BAD_CAST("ID")), xmlFree); + const shared_ptr<xmlChar> masterPageString(xmlTextReaderGetAttribute(reader, BAD_CAST("Master")), xmlFree); + const shared_ptr<xmlChar> masterShapeString(xmlTextReaderGetAttribute(reader, BAD_CAST("MasterShape")), xmlFree); + const shared_ptr<xmlChar> lineStyleString(xmlTextReaderGetAttribute(reader, BAD_CAST("LineStyle")), xmlFree); + const shared_ptr<xmlChar> fillStyleString(xmlTextReaderGetAttribute(reader, BAD_CAST("FillStyle")), xmlFree); + const shared_ptr<xmlChar> textStyleString(xmlTextReaderGetAttribute(reader, BAD_CAST("TextStyle")), xmlFree); unsigned id = idString ? (unsigned)xmlStringToLong(idString) : MINUS_ONE; unsigned masterPage = masterPageString ? (unsigned)xmlStringToLong(masterPageString) : MINUS_ONE; @@ -956,19 +943,6 @@ void libvisio::VSDXMLParserBase::readShape(xmlTextReaderPtr reader) unsigned fillStyle = fillStyleString ? (unsigned)xmlStringToLong(fillStyleString) : MINUS_ONE; unsigned textStyle = textStyleString ? (unsigned)xmlStringToLong(textStyleString) : MINUS_ONE; - if (idString) - xmlFree(idString); - if (masterPageString) - xmlFree(masterPageString); - if (masterShapeString) - xmlFree(masterShapeString); - if (lineStyleString) - xmlFree(lineStyleString); - if (fillStyleString) - xmlFree(fillStyleString); - if (textStyleString) - xmlFree(textStyleString); - if (masterPage != MINUS_ONE || masterShape != MINUS_ONE) { if (!m_shapeStack.empty()) @@ -1067,14 +1041,12 @@ void libvisio::VSDXMLParserBase::readColours(xmlTextReaderPtr reader) if (XML_COLORENTRY == tokenId) { unsigned idx = getIX(reader); - xmlChar *rgb = xmlTextReaderGetAttribute(reader, BAD_CAST("RGB")); + const shared_ptr<xmlChar> rgb(xmlTextReaderGetAttribute(reader, BAD_CAST("RGB")), xmlFree); if (MINUS_ONE != idx && rgb) { Colour rgbColour = xmlStringToColour(rgb); m_colours[idx] = rgbColour; } - if (rgb) - xmlFree(rgb); } } while ((XML_COLORS != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); @@ -1083,10 +1055,10 @@ void libvisio::VSDXMLParserBase::readColours(xmlTextReaderPtr reader) void libvisio::VSDXMLParserBase::readPage(xmlTextReaderPtr reader) { m_shapeList.clear(); - xmlChar *id = xmlTextReaderGetAttribute(reader, BAD_CAST("ID")); - xmlChar *bgndPage = xmlTextReaderGetAttribute(reader, BAD_CAST("BackPage")); - xmlChar *background = xmlTextReaderGetAttribute(reader, BAD_CAST("Background")); - xmlChar *pageName = xmlTextReaderGetAttribute(reader, BAD_CAST("NameU")); + const shared_ptr<xmlChar> id(xmlTextReaderGetAttribute(reader, BAD_CAST("ID")), xmlFree); + const shared_ptr<xmlChar> bgndPage(xmlTextReaderGetAttribute(reader, BAD_CAST("BackPage")), xmlFree); + const shared_ptr<xmlChar> background(xmlTextReaderGetAttribute(reader, BAD_CAST("Background")), xmlFree); + const shared_ptr<xmlChar> pageName(xmlTextReaderGetAttribute(reader, BAD_CAST("NameU")), xmlFree); if (id) { unsigned nId = (unsigned)xmlStringToLong(id); @@ -1094,16 +1066,8 @@ void libvisio::VSDXMLParserBase::readPage(xmlTextReaderPtr reader) bool isBackgroundPage = background ? xmlStringToBool(background) : false; m_isPageStarted = true; m_collector->startPage(nId); - m_collector->collectPage(nId, (unsigned)getElementDepth(reader), backgroundPageID, isBackgroundPage, pageName ? VSDName(librevenge::RVNGBinaryData(pageName, xmlStrlen(pageName)), VSD_TEXT_UTF8) : VSDName()); + m_collector->collectPage(nId, (unsigned)getElementDepth(reader), backgroundPageID, isBackgroundPage, pageName ? VSDName(librevenge::RVNGBinaryData(pageName.get(), xmlStrlen(pageName.get())), VSD_TEXT_UTF8) : VSDName()); } - if (id) - xmlFree(id); - if (bgndPage) - xmlFree(bgndPage); - if (background) - xmlFree(background); - if (pageName) - xmlFree(pageName); } void libvisio::VSDXMLParserBase::readText(xmlTextReaderPtr reader) @@ -1250,8 +1214,6 @@ void libvisio::VSDXMLParserBase::readCharIX(xmlTextReaderPtr reader) font = VSDName(librevenge::RVNGBinaryData(stringValue, xmlStrlen(stringValue)), VSD_TEXT_UTF8); } } - if (stringValue) - xmlFree(stringValue); } break; case XML_COLOR: @@ -1459,10 +1421,10 @@ void libvisio::VSDXMLParserBase::readParaIX(xmlTextReaderPtr reader) void libvisio::VSDXMLParserBase::readStyleSheet(xmlTextReaderPtr reader) { - xmlChar *id = xmlTextReaderGetAttribute(reader, BAD_CAST("ID")); - xmlChar *lineStyle = xmlTextReaderGetAttribute(reader, BAD_CAST("LineStyle")); - xmlChar *fillStyle = xmlTextReaderGetAttribute(reader, BAD_CAST("FillStyle")); - xmlChar *textStyle = xmlTextReaderGetAttribute(reader, BAD_CAST("TextStyle")); + const shared_ptr<xmlChar> id(xmlTextReaderGetAttribute(reader, BAD_CAST("ID")), xmlFree); + const shared_ptr<xmlChar> lineStyle(xmlTextReaderGetAttribute(reader, BAD_CAST("LineStyle")), xmlFree); + const shared_ptr<xmlChar> fillStyle(xmlTextReaderGetAttribute(reader, BAD_CAST("FillStyle")), xmlFree); + const shared_ptr<xmlChar> textStyle(xmlTextReaderGetAttribute(reader, BAD_CAST("TextStyle")), xmlFree); if (id) { unsigned nId = (unsigned)xmlStringToLong(id); @@ -1471,14 +1433,6 @@ void libvisio::VSDXMLParserBase::readStyleSheet(xmlTextReaderPtr reader) unsigned nTextStyle = (unsigned)(textStyle ? xmlStringToLong(textStyle) : -1); m_collector->collectStyleSheet(nId, (unsigned)getElementDepth(reader), nLineStyle, nFillStyle, nTextStyle); } - if (id) - xmlFree(id); - if (lineStyle) - xmlFree(lineStyle); - if (fillStyle) - xmlFree(fillStyle); - if (textStyle) - xmlFree(textStyle); } void libvisio::VSDXMLParserBase::readPageSheet(xmlTextReaderPtr reader) @@ -1498,12 +1452,11 @@ void libvisio::VSDXMLParserBase::readSplineStart(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -1565,12 +1518,11 @@ void libvisio::VSDXMLParserBase::readSplineKnot(xmlTextReaderPtr reader) if (xmlTextReaderIsEmptyElement(reader)) { - xmlChar *delString = xmlTextReaderGetAttribute(reader, BAD_CAST("Del")); + const shared_ptr<xmlChar> delString(xmlTextReaderGetAttribute(reader, BAD_CAST("Del")), xmlFree); if (delString) { if (xmlStringToBool(delString)) m_currentGeometryList->addEmpty(ix, level); - xmlFree(delString); } return; } @@ -1611,12 +1563,11 @@ void libvisio::VSDXMLParserBase::readSplineKnot(xmlTextReaderPtr reader) void libvisio::VSDXMLParserBase::readStencil(xmlTextReaderPtr reader) { - xmlChar *id = xmlTextReaderGetAttribute(reader, BAD_CAST("ID")); + const shared_ptr<xmlChar> id(xmlTextReaderGetAttribute(reader, BAD_CAST("ID")), xmlFree); if (id) { unsigned nId = (unsigned)xmlStringToLong(id); m_currentStencilID = nId; - xmlFree(id); } else m_currentStencilID = MINUS_ONE; @@ -1631,33 +1582,31 @@ void libvisio::VSDXMLParserBase::readForeignData(xmlTextReaderPtr reader) if (!m_shape.m_foreign) m_shape.m_foreign = new ForeignData(); - xmlChar *foreignTypeString = xmlTextReaderGetAttribute(reader, BAD_CAST("ForeignType")); + const shared_ptr<xmlChar> foreignTypeString(xmlTextReaderGetAttribute(reader, BAD_CAST("ForeignType")), xmlFree); if (foreignTypeString) { - if (xmlStrEqual(foreignTypeString, BAD_CAST("Bitmap"))) + if (xmlStrEqual(foreignTypeString.get(), BAD_CAST("Bitmap"))) m_shape.m_foreign->type = 1; - else if (xmlStrEqual(foreignTypeString, BAD_CAST("Object"))) + else if (xmlStrEqual(foreignTypeString.get(), BAD_CAST("Object"))) m_shape.m_foreign->type = 2; - else if (xmlStrEqual(foreignTypeString, BAD_CAST("EnhMetaFile"))) + else if (xmlStrEqual(foreignTypeString.get(), BAD_CAST("EnhMetaFile"))) m_shape.m_foreign->type = 4; - else if (xmlStrEqual(foreignTypeString, BAD_CAST("MetaFile"))) + else if (xmlStrEqual(foreignTypeString.get(), BAD_CAST("MetaFile"))) m_shape.m_foreign->type = 0; - xmlFree(foreignTypeString); } - xmlChar *foreignFormatString = xmlTextReaderGetAttribute(reader, BAD_CAST("CompressionType")); + const shared_ptr<xmlChar> foreignFormatString(xmlTextReaderGetAttribute(reader, BAD_CAST("CompressionType")), xmlFree); if (foreignFormatString) { - if (xmlStrEqual(foreignFormatString, BAD_CAST("JPEG"))) + if (xmlStrEqual(foreignFormatString.get(), BAD_CAST("JPEG"))) m_shape.m_foreign->format = 1; - else if (xmlStrEqual(foreignFormatString, BAD_CAST("GIF"))) + else if (xmlStrEqual(foreignFormatString.get(), BAD_CAST("GIF"))) m_shape.m_foreign->format = 2; - else if (xmlStrEqual(foreignFormatString, BAD_CAST("TIFF"))) + else if (xmlStrEqual(foreignFormatString.get(), BAD_CAST("TIFF"))) m_shape.m_foreign->format = 3; - else if (xmlStrEqual(foreignFormatString, BAD_CAST("PNG"))) + else if (xmlStrEqual(foreignFormatString.get(), BAD_CAST("PNG"))) m_shape.m_foreign->format = 4; else m_shape.m_foreign->format = 0; - xmlFree(foreignFormatString); } else m_shape.m_foreign->format = 255; @@ -1886,13 +1835,13 @@ int libvisio::VSDXMLParserBase::readNURBSData(boost::optional<NURBSData> &data, NURBSData tmpData; bool bRes = false; - xmlChar *formula = readStringData(reader); + const shared_ptr<xmlChar> formula(readStringData(reader), xmlFree); if (formula) { std::pair<double, double> point; - bRes = parse((const char *)formula, + bRes = parse((const char *)formula.get(), // Begin grammar ( str_p("NURBS") @@ -1912,8 +1861,6 @@ int libvisio::VSDXMLParserBase::readNURBSData(boost::optional<NURBSData> &data, ) >> ')' >> end_p, // End grammar space_p).full; - - xmlFree(formula); } if (!bRes) @@ -1929,13 +1876,13 @@ int libvisio::VSDXMLParserBase::readPolylineData(boost::optional<PolylineData> & PolylineData tmpData; bool bRes = false; - xmlChar *formula = readStringData(reader); + const shared_ptr<xmlChar> formula(readStringData(reader), xmlFree); if (formula) { std::pair<double, double> point; - bRes = parse((const char *)formula, + bRes = parse((const char *)formula.get(), // Begin grammar ( str_p("POLYLINE") @@ -1950,8 +1897,6 @@ int libvisio::VSDXMLParserBase::readPolylineData(boost::optional<PolylineData> & ) >> ')' >> end_p, // End grammar space_p).full; - - xmlFree(formula); } if (!bRes) @@ -1963,13 +1908,12 @@ int libvisio::VSDXMLParserBase::readPolylineData(boost::optional<PolylineData> & int libvisio::VSDXMLParserBase::readDoubleData(double &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readDoubleData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readDoubleData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToDouble(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -1977,13 +1921,12 @@ int libvisio::VSDXMLParserBase::readDoubleData(double &value, xmlTextReaderPtr r int libvisio::VSDXMLParserBase::readDoubleData(boost::optional<double> &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readDoubleData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readDoubleData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToDouble(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -1991,13 +1934,12 @@ int libvisio::VSDXMLParserBase::readDoubleData(boost::optional<double> &value, x int libvisio::VSDXMLParserBase::readLongData(long &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readLongData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readLongData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToLong(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -2005,13 +1947,12 @@ int libvisio::VSDXMLParserBase::readLongData(long &value, xmlTextReaderPtr reade int libvisio::VSDXMLParserBase::readLongData(boost::optional<long> &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readLongData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readLongData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToLong(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -2019,13 +1960,12 @@ int libvisio::VSDXMLParserBase::readLongData(boost::optional<long> &value, xmlTe int libvisio::VSDXMLParserBase::readBoolData(bool &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readBoolData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readBoolData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToBool(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -2033,13 +1973,12 @@ int libvisio::VSDXMLParserBase::readBoolData(bool &value, xmlTextReaderPtr reade int libvisio::VSDXMLParserBase::readBoolData(boost::optional<bool> &value, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readBoolData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readBoolData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) value = xmlStringToBool(stringValue); - xmlFree(stringValue); return 1; } return -1; @@ -2073,11 +2012,11 @@ int libvisio::VSDXMLParserBase::readByteData(boost::optional<unsigned char> &val int libvisio::VSDXMLParserBase::readExtendedColourData(Colour &value, long &idx, xmlTextReaderPtr reader) { - xmlChar *stringValue = readStringData(reader); + const shared_ptr<xmlChar> stringValue(readStringData(reader), xmlFree); if (stringValue) { - VSD_DEBUG_MSG(("VSDXMLParserBase::readColourData stringValue %s\n", (const char *)stringValue)); - if (!xmlStrEqual(stringValue, BAD_CAST("Themed"))) + VSD_DEBUG_MSG(("VSDXMLParserBase::readColourData stringValue %s\n", (const char *)stringValue.get())); + if (!xmlStrEqual(stringValue.get(), BAD_CAST("Themed"))) { try { @@ -2096,7 +2035,6 @@ int libvisio::VSDXMLParserBase::readExtendedColourData(Colour &value, long &idx, idx = -1; } } - xmlFree(stringValue); return 1; } return -1; commit f6122c37edad438843660e4abf2792159a06a12d Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 16:00:19 2015 +0200 avoid memory leak Change-Id: I66851b20c42e5a740a0401a61e8536d9b3e0b503 diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index d65308e..e889fff 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -12,6 +12,7 @@ #include <libxml/xmlstring.h> #include <librevenge-stream/librevenge-stream.h> #include <boost/algorithm/string.hpp> +#include <boost/shared_ptr.hpp> #include "VSDXParser.h" #include "libvisio_utils.h" #include "VSDContentCollector.h" @@ -313,10 +314,10 @@ void libvisio::VSDXParser::processXmlDocument(librevenge::RVNGInputStream *input case XML_REL: if (XML_READER_TYPE_ELEMENT == tokenType) { - xmlChar *id = xmlTextReaderGetAttribute(reader.get(), BAD_CAST("r:id")); + boost::shared_ptr<xmlChar> id(xmlTextReaderGetAttribute(reader.get(), BAD_CAST("r:id")), xmlFree); if (id) { - const VSDXRelationship *rel = rels.getRelationshipById((char *)id); + const VSDXRelationship *rel = rels.getRelationshipById((char *)id.get()); if (rel) { std::string type = rel->getType(); @@ -339,7 +340,6 @@ void libvisio::VSDXParser::processXmlDocument(librevenge::RVNGInputStream *input else processXmlNode(reader.get()); } - xmlFree(id); } } break; commit 0aaab87fa47283c2dedc2c1c827fc56f0b24b74e Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 15:56:17 2015 +0200 avoid memory leak in case of exception Change-Id: I1129c4a3e779270c6c5e43229d3d31a6376eb3b3 diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index fa74c71..8b6d204 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -12,6 +12,7 @@ #include <libxml/xmlstring.h> #include <librevenge-stream/librevenge-stream.h> #include <boost/algorithm/string.hpp> +#include <boost/shared_ptr.hpp> #include <boost/spirit/include/classic.hpp> #include "VSDXMLParserBase.h" #include "libvisio_utils.h" @@ -2118,12 +2119,9 @@ int libvisio::VSDXMLParserBase::readExtendedColourData(Colour &value, xmlTextRea unsigned libvisio::VSDXMLParserBase::getIX(xmlTextReaderPtr reader) { unsigned ix = MINUS_ONE; - xmlChar *ixString = xmlTextReaderGetAttribute(reader, BAD_CAST("IX")); + const boost::shared_ptr<xmlChar> ixString(xmlTextReaderGetAttribute(reader, BAD_CAST("IX")), xmlFree); if (ixString) - { - ix = (unsigned)xmlStringToLong(ixString); - xmlFree(ixString); - } + ix = (unsigned)xmlStringToLong(ixString.get()); return ix; } commit a69da92be817325e36e7ee5dcdb6c9d3146dad5a Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 15:52:55 2015 +0200 avoid leak of xmlTextReader Change-Id: If82d2b1a81a742a65d9826513e3d83b779602b7b diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index d2be71a..d65308e 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -299,21 +299,21 @@ void libvisio::VSDXParser::processXmlDocument(librevenge::RVNGInputStream *input m_rels = &rels; - xmlTextReaderPtr reader = xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET); + boost::shared_ptr<xmlTextReader> reader(xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET), xmlFreeTextReader); if (!reader) return; - int ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); while (1 == ret) { - int tokenId = VSDXMLTokenMap::getTokenId(xmlTextReaderConstName(reader)); - int tokenType = xmlTextReaderNodeType(reader); + int tokenId = VSDXMLTokenMap::getTokenId(xmlTextReaderConstName(reader.get())); + int tokenType = xmlTextReaderNodeType(reader.get()); switch (tokenId) { case XML_REL: if (XML_READER_TYPE_ELEMENT == tokenType) { - xmlChar *id = xmlTextReaderGetAttribute(reader, BAD_CAST("r:id")); + xmlChar *id = xmlTextReaderGetAttribute(reader.get(), BAD_CAST("r:id")); if (id) { const VSDXRelationship *rel = rels.getRelationshipById((char *)id); @@ -322,34 +322,33 @@ void libvisio::VSDXParser::processXmlDocument(librevenge::RVNGInputStream *input std::string type = rel->getType(); if (type == "http://schemas.microsoft.com/visio/2010/relationships/master") { - m_currentDepth += xmlTextReaderDepth(reader); + m_currentDepth += xmlTextReaderDepth(reader.get()); parseMaster(m_input, rel->getTarget().c_str()); - m_currentDepth -= xmlTextReaderDepth(reader); + m_currentDepth -= xmlTextReaderDepth(reader.get()); } else if (type == "http://schemas.microsoft.com/visio/2010/relationships/page") { - m_currentDepth += xmlTextReaderDepth(reader); + m_currentDepth += xmlTextReaderDepth(reader.get()); parsePage(m_input, rel->getTarget().c_str()); - m_currentDepth -= xmlTextReaderDepth(reader); + m_currentDepth -= xmlTextReaderDepth(reader.get()); } else if (type == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") { extractBinaryData(m_input, rel->getTarget().c_str()); } else - processXmlNode(reader); + processXmlNode(reader.get()); } xmlFree(id); } } break; default: - processXmlNode(reader); + processXmlNode(reader.get()); break; } - ret = xmlTextReaderRead(reader); + ret = xmlTextReaderRead(reader.get()); } - xmlFreeTextReader(reader); } void libvisio::VSDXParser::processXmlNode(xmlTextReaderPtr reader) commit e8e0700a9ac0c87e058678f64ae39d3eef4a11fd Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 15:50:06 2015 +0200 use shared_ptr for streams Change-Id: I3733f901ea75bfaf55941832890408de637a0417 diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 5063507..d2be71a 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -115,15 +115,13 @@ bool libvisio::VSDXParser::parseDocument(librevenge::RVNGInputStream *input, con input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); input->seek(0, librevenge::RVNG_SEEK_SET); if (!stream) return false; - librevenge::RVNGInputStream *relStream = input->getSubStreamByName(getRelationshipsForTarget(name).c_str()); + const RVNGInputStreamPtr_t relStream(input->getSubStreamByName(getRelationshipsForTarget(name).c_str())); input->seek(0, librevenge::RVNG_SEEK_SET); - VSDXRelationships rels(relStream); - if (relStream) - delete relStream; + VSDXRelationships rels(relStream.get()); rels.rebaseTargets(getTargetBaseDirectory(name).c_str()); const VSDXRelationship *rel = rels.getRelationshipByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"); @@ -136,7 +134,7 @@ bool libvisio::VSDXParser::parseDocument(librevenge::RVNGInputStream *input, con input->seek(0, librevenge::RVNG_SEEK_SET); } - processXmlDocument(stream, rels); + processXmlDocument(stream.get(), rels); rel = rels.getRelationshipByType("http://schemas.microsoft.com/visio/2010/relationships/masters"); if (rel) @@ -158,8 +156,6 @@ bool libvisio::VSDXParser::parseDocument(librevenge::RVNGInputStream *input, con input->seek(0, librevenge::RVNG_SEEK_SET); } - if (stream) - delete stream; return true; } @@ -170,19 +166,16 @@ bool libvisio::VSDXParser::parseMasters(librevenge::RVNGInputStream *input, cons input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return false; - librevenge::RVNGInputStream *relStream = input->getSubStreamByName(getRelationshipsForTarget(name).c_str()); + const RVNGInputStreamPtr_t relStream(input->getSubStreamByName(getRelationshipsForTarget(name).c_str())); input->seek(0, librevenge::RVNG_SEEK_SET); - VSDXRelationships rels(relStream); - if (relStream) - delete relStream; + VSDXRelationships rels(relStream.get()); rels.rebaseTargets(getTargetBaseDirectory(name).c_str()); - processXmlDocument(stream, rels); + processXmlDocument(stream.get(), rels); - delete stream; return true; } @@ -193,19 +186,16 @@ bool libvisio::VSDXParser::parseMaster(librevenge::RVNGInputStream *input, const input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return false; - librevenge::RVNGInputStream *relStream = input->getSubStreamByName(getRelationshipsForTarget(name).c_str()); + const RVNGInputStreamPtr_t relStream(input->getSubStreamByName(getRelationshipsForTarget(name).c_str())); input->seek(0, librevenge::RVNG_SEEK_SET); - VSDXRelationships rels(relStream); - if (relStream) - delete relStream; + VSDXRelationships rels(relStream.get()); rels.rebaseTargets(getTargetBaseDirectory(name).c_str()); - processXmlDocument(stream, rels); + processXmlDocument(stream.get(), rels); - delete stream; return true; } @@ -216,19 +206,16 @@ bool libvisio::VSDXParser::parsePages(librevenge::RVNGInputStream *input, const input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return false; - librevenge::RVNGInputStream *relStream = input->getSubStreamByName(getRelationshipsForTarget(name).c_str()); + const RVNGInputStreamPtr_t relStream(input->getSubStreamByName(getRelationshipsForTarget(name).c_str())); input->seek(0, librevenge::RVNG_SEEK_SET); - VSDXRelationships rels(relStream); - if (relStream) - delete relStream; + VSDXRelationships rels(relStream.get()); rels.rebaseTargets(getTargetBaseDirectory(name).c_str()); - processXmlDocument(stream, rels); + processXmlDocument(stream.get(), rels); - delete stream; return true; } @@ -239,19 +226,16 @@ bool libvisio::VSDXParser::parsePage(librevenge::RVNGInputStream *input, const c input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return false; - librevenge::RVNGInputStream *relStream = input->getSubStreamByName(getRelationshipsForTarget(name).c_str()); + const RVNGInputStreamPtr_t relStream(input->getSubStreamByName(getRelationshipsForTarget(name).c_str())); input->seek(0, librevenge::RVNG_SEEK_SET); - VSDXRelationships rels(relStream); - if (relStream) - delete relStream; + VSDXRelationships rels(relStream.get()); rels.rebaseTargets(getTargetBaseDirectory(name).c_str()); - processXmlDocument(stream, rels); + processXmlDocument(stream.get(), rels); - delete stream; return true; } @@ -262,13 +246,12 @@ bool libvisio::VSDXParser::parseTheme(librevenge::RVNGInputStream *input, const input->seek(0, librevenge::RVNG_SEEK_SET); if (!input->isStructured()) return false; - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return false; - m_currentTheme.parse(stream); + m_currentTheme.parse(stream.get()); - delete stream; return true; } @@ -286,24 +269,22 @@ bool libvisio::VSDXParser::parseMetaData(librevenge::RVNGInputStream *input, lib const libvisio::VSDXRelationship *coreProp = rels.getRelationshipByType("http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"); if (coreProp) { - librevenge::RVNGInputStream *stream = input->getSubStreamByName(coreProp->getTarget().c_str()); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(coreProp->getTarget().c_str())); if (stream) { result = true; - metaData.parse(stream); - delete stream; + metaData.parse(stream.get()); } } const libvisio::VSDXRelationship *extendedProp = rels.getRelationshipByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"); if (extendedProp) { - librevenge::RVNGInputStream *stream = input->getSubStreamByName(extendedProp->getTarget().c_str()); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(extendedProp->getTarget().c_str())); if (stream) { result = true; - metaData.parse(stream); - delete stream; + metaData.parse(stream.get()); } } m_collector->collectMetaData(metaData.getMetaData()); @@ -536,7 +517,7 @@ void libvisio::VSDXParser::extractBinaryData(librevenge::RVNGInputStream *input, if (!input || !input->isStructured()) return; input->seek(0, librevenge::RVNG_SEEK_SET); - librevenge::RVNGInputStream *stream = input->getSubStreamByName(name); + const RVNGInputStreamPtr_t stream(input->getSubStreamByName(name)); if (!stream) return; while (true) @@ -548,7 +529,6 @@ void libvisio::VSDXParser::extractBinaryData(librevenge::RVNGInputStream *input, if (stream->isEnd()) break; } - delete stream; VSD_DEBUG_MSG(("%s\n", m_currentBinaryData.getBase64Data().cstr())); } commit 6403c07b9d5e420cce2c060c09223f81b2a5c48a Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 15:41:35 2015 +0200 use shared_ptr for streams Change-Id: If33a4b0f1f47683412d6696f6d06de9844c5971c diff --git a/configure.ac b/configure.ac index 40747e9..00d0f3a 100644 --- a/configure.ac +++ b/configure.ac @@ -106,6 +106,7 @@ AC_CHECK_HEADERS( boost/algorithm/string.hpp \ boost/lexical_cast.hpp \ boost/optional.hpp \ + boost/shared_ptr.hpp \ boost/spirit/include/classic.hpp, [], [AC_MSG_ERROR(Required boost headers not found. install boost >= 1.36)], diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 02a3989..5063507 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -60,53 +60,46 @@ libvisio::VSDXParser::~VSDXParser() { } -bool libvisio::VSDXParser::parseMain() +bool libvisio::VSDXParser::parseMain() try { if (!m_input || !m_input->isStructured()) return false; - librevenge::RVNGInputStream *tmpInput = 0; - try - { - tmpInput = m_input->getSubStreamByName("_rels/.rels"); - if (!tmpInput) - return false; - - libvisio::VSDXRelationships rootRels(tmpInput); - delete tmpInput; - tmpInput = 0; + RVNGInputStreamPtr_t tmpInput; + tmpInput.reset(m_input->getSubStreamByName("_rels/.rels")); + if (!tmpInput) + return false; - // Check whether the relationship points to a Visio document stream - const libvisio::VSDXRelationship *rel = rootRels.getRelationshipByType("http://schemas.microsoft.com/visio/2010/relationships/document"); - if (!rel) - return false; + libvisio::VSDXRelationships rootRels(tmpInput.get()); - std::vector<std::map<unsigned, XForm> > groupXFormsSequence; - std::vector<std::map<unsigned, unsigned> > groupMembershipsSequence; - std::vector<std::list<unsigned> > documentPageShapeOrders; + // Check whether the relationship points to a Visio document stream + const libvisio::VSDXRelationship *rel = rootRels.getRelationshipByType("http://schemas.microsoft.com/visio/2010/relationships/document"); + if (!rel) + return false; - VSDStylesCollector stylesCollector(groupXFormsSequence, groupMembershipsSequence, documentPageShapeOrders); - m_collector = &stylesCollector; - if (!parseDocument(m_input, rel->getTarget().c_str())) - return false; + std::vector<std::map<unsigned, XForm> > groupXFormsSequence; + std::vector<std::map<unsigned, unsigned> > groupMembershipsSequence; + std::vector<std::list<unsigned> > documentPageShapeOrders; - VSDStyles styles = stylesCollector.getStyleSheets(); + VSDStylesCollector stylesCollector(groupXFormsSequence, groupMembershipsSequence, documentPageShapeOrders); + m_collector = &stylesCollector; + if (!parseDocument(m_input, rel->getTarget().c_str())) + return false; - VSDContentCollector contentCollector(m_painter, groupXFormsSequence, groupMembershipsSequence, documentPageShapeOrders, styles, m_stencils); - m_collector = &contentCollector; - parseMetaData(m_input, rootRels); + VSDStyles styles = stylesCollector.getStyleSheets(); - if (!parseDocument(m_input, rel->getTarget().c_str())) - return false; + VSDContentCollector contentCollector(m_painter, groupXFormsSequence, groupMembershipsSequence, documentPageShapeOrders, styles, m_stencils); + m_collector = &contentCollector; + parseMetaData(m_input, rootRels); - return true; - } - catch (...) - { - if (tmpInput) - delete tmpInput; + if (!parseDocument(m_input, rel->getTarget().c_str())) return false; - } + + return true; +} +catch (...) +{ + return false; } bool libvisio::VSDXParser::extractStencils() diff --git a/src/lib/libvisio_utils.h b/src/lib/libvisio_utils.h index 0836f4b..0ff3a16 100644 --- a/src/lib/libvisio_utils.h +++ b/src/lib/libvisio_utils.h @@ -10,6 +10,8 @@ #ifndef __LIBVISIO_UTILS_H__ #define __LIBVISIO_UTILS_H__ +#include <boost/shared_ptr.hpp> + #include "VSDTypes.h" #ifdef _MSC_VER @@ -68,6 +70,8 @@ typedef unsigned __int64 uint64_t; namespace libvisio { +typedef boost::shared_ptr<librevenge::RVNGInputStream> RVNGInputStreamPtr_t; + uint8_t readU8(librevenge::RVNGInputStream *input); uint16_t readU16(librevenge::RVNGInputStream *input); int16_t readS16(librevenge::RVNGInputStream *input); commit 2496ab82164620a13eca99862b93648bd1c79d03 Author: David Tardon <dtar...@redhat.com> Date: Tue Jul 14 12:18:28 2015 +0200 avoid double deletion in case of exception Change-Id: Ic2767a987ab0890f0dc8fd4e087d0c830ff08bfa diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index b8669dd..02a3989 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -74,6 +74,7 @@ bool libvisio::VSDXParser::parseMain() libvisio::VSDXRelationships rootRels(tmpInput); delete tmpInput; + tmpInput = 0; // Check whether the relationship points to a Visio document stream const libvisio::VSDXRelationship *rel = rootRels.getRelationshipByType("http://schemas.microsoft.com/visio/2010/relationships/document"); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits