src/lib/VDXParser.cpp | 12 +++++++----- src/lib/VSD5Parser.cpp | 2 +- src/lib/VSD6Parser.cpp | 2 +- src/lib/VSDParser.cpp | 5 ++++- src/lib/VSDXMLHelper.cpp | 18 ++++++++++-------- src/lib/VSDXMetaData.cpp | 15 ++++++++------- src/lib/VSDXParser.cpp | 6 +++--- src/lib/VSDXTheme.cpp | 14 +++++++------- src/lib/VisioDocument.cpp | 24 +++++++++--------------- 9 files changed, 50 insertions(+), 48 deletions(-)
New commits: commit 17b71055939e80ea83506c633b908ca831bd0fad Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 19:02:28 2015 +0200 don't leak in case of exception Change-Id: Ib9eb9e02b678bc892b4cefd9fb793a06b2302879 diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp index 38b7a6c..1776de2 100644 --- a/src/lib/VDXParser.cpp +++ b/src/lib/VDXParser.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 "VDXParser.h" #include "libvisio_utils.h" #include "VSDContentCollector.h" @@ -73,17 +74,18 @@ bool libvisio::VDXParser::processXmlDocument(librevenge::RVNGInputStream *input) if (!input) return false; - xmlTextReaderPtr reader = xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER); + const boost::shared_ptr<xmlTextReader> reader( + xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER), + xmlFreeTextReader); if (!reader) return false; - int ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); while (1 == ret) { - processXmlNode(reader); + processXmlNode(reader.get()); - ret = xmlTextReaderRead(reader); + ret = xmlTextReaderRead(reader.get()); } - xmlFreeTextReader(reader); return true; } diff --git a/src/lib/VSDXMLHelper.cpp b/src/lib/VSDXMLHelper.cpp index 925e70b..b42b093 100644 --- a/src/lib/VSDXMLHelper.cpp +++ b/src/lib/VSDXMLHelper.cpp @@ -16,6 +16,7 @@ #include <vector> #include <boost/algorithm/string.hpp> #include <boost/lexical_cast.hpp> +#include <boost/shared_ptr.hpp> #include <libxml/xmlIO.h> #include <libxml/xmlstring.h> #include <librevenge-stream/librevenge-stream.h> @@ -264,7 +265,9 @@ libvisio::VSDXRelationships::VSDXRelationships(librevenge::RVNGInputStream *inpu { if (input) { - shared_ptr<xmlTextReader> reader(xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER), xmlFreeTextReader); + const boost::shared_ptr<xmlTextReader> reader( + xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER), + xmlFreeTextReader); if (reader) { bool inRelationships = false; diff --git a/src/lib/VSDXMetaData.cpp b/src/lib/VSDXMetaData.cpp index 94b1f99..ffcad6e 100644 --- a/src/lib/VSDXMetaData.cpp +++ b/src/lib/VSDXMetaData.cpp @@ -11,6 +11,7 @@ #include "VSDXMLTokenMap.h" #include "libvisio_utils.h" #include <string> +#include <boost/shared_ptr.hpp> libvisio::VSDXMetaData::VSDXMetaData() : m_metaData() @@ -115,35 +116,35 @@ bool libvisio::VSDXMetaData::parse(librevenge::RVNGInputStream *input) if (!input) return false; - xmlTextReaderPtr reader = xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET); + const boost::shared_ptr<xmlTextReader> reader( + xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET), + xmlFreeTextReader); if (!reader) return false; try { - int ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); while (1 == ret) { - int tokenId = getElementToken(reader); + int tokenId = getElementToken(reader.get()); switch (tokenId) { case XML_CP_COREPROPERTIES: case XML_PROPERTIES: - readCoreProperties(reader); + readCoreProperties(reader.get()); break; default: break; } - ret = xmlTextReaderRead(reader); + ret = xmlTextReaderRead(reader.get()); } } catch (...) { - xmlFreeTextReader(reader); return false; } - xmlFreeTextReader(reader); return true; } diff --git a/src/lib/VSDXTheme.cpp b/src/lib/VSDXTheme.cpp index f962105..142623f 100644 --- a/src/lib/VSDXTheme.cpp +++ b/src/lib/VSDXTheme.cpp @@ -65,34 +65,34 @@ bool libvisio::VSDXTheme::parse(librevenge::RVNGInputStream *input) if (!input) return false; - xmlTextReaderPtr reader = xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET); + const shared_ptr<xmlTextReader> reader( + xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET), + xmlFreeTextReader); if (!reader) return false; try { - int ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); while (1 == ret) { - int tokenId = getElementToken(reader); + int tokenId = getElementToken(reader.get()); switch (tokenId) { case XML_A_CLRSCHEME: - readClrScheme(reader); + readClrScheme(reader.get()); break; default: break; } - ret = xmlTextReaderRead(reader); + ret = xmlTextReaderRead(reader.get()); } } catch (...) { - xmlFreeTextReader(reader); return false; } - xmlFreeTextReader(reader); return true; } diff --git a/src/lib/VisioDocument.cpp b/src/lib/VisioDocument.cpp index 5b27404..ee7c758 100644 --- a/src/lib/VisioDocument.cpp +++ b/src/lib/VisioDocument.cpp @@ -8,6 +8,7 @@ */ #include <string> +#include <boost/shared_ptr.hpp> #include <librevenge/librevenge.h> #include <libvisio/libvisio.h> #include "libvisio_utils.h" @@ -245,56 +246,49 @@ static bool parseOpcVisioDocument(librevenge::RVNGInputStream *input, librevenge static bool isXmlVisioDocument(librevenge::RVNGInputStream *input) { - xmlTextReaderPtr reader = 0; try { input->seek(0, librevenge::RVNG_SEEK_SET); - reader = libvisio::xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER); + const boost::shared_ptr<xmlTextReader> reader( + libvisio::xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER), + xmlFreeTextReader); if (!reader) return false; - int ret = xmlTextReaderRead(reader); - while (ret == 1 && 1 != xmlTextReaderNodeType(reader)) - ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); + while (ret == 1 && 1 != xmlTextReaderNodeType(reader.get())) + ret = xmlTextReaderRead(reader.get()); if (ret != 1) { - xmlFreeTextReader(reader); return false; } - const xmlChar *name = xmlTextReaderConstName(reader); + const xmlChar *name = xmlTextReaderConstName(reader.get()); if (!name) { - xmlFreeTextReader(reader); return false; } if (!xmlStrEqual(name, BAD_CAST("VisioDocument"))) { - xmlFreeTextReader(reader); return false; } // Checking the two possible namespaces of VDX documents. This may be a bit strict // and filter out some of third party VDX documents. If that happens, commenting out // this block could be an option. - const xmlChar *nsname = xmlTextReaderConstNamespaceUri(reader); + const xmlChar *nsname = xmlTextReaderConstNamespaceUri(reader.get()); if (!nsname) { - xmlFreeTextReader(reader); return false; } if (!xmlStrEqual(nsname, BAD_CAST("urn:schemas-microsoft-com:office:visio")) && !xmlStrEqual(nsname, BAD_CAST("http://schemas.microsoft.com/visio/2003/core"))) { - xmlFreeTextReader(reader); return false; } - xmlFreeTextReader(reader); return true; } catch (...) { - if (reader) - xmlFreeTextReader(reader); return false; } } commit 5e66100518d8e7f63e296178c48b1fc56fa3b765 Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 18:54:23 2015 +0200 avoid memory leak Change-Id: Ifb59e5f916b23fb681452c45149e56730ff36a89 diff --git a/src/lib/VSDXMLHelper.cpp b/src/lib/VSDXMLHelper.cpp index 582763e..925e70b 100644 --- a/src/lib/VSDXMLHelper.cpp +++ b/src/lib/VSDXMLHelper.cpp @@ -264,24 +264,24 @@ libvisio::VSDXRelationships::VSDXRelationships(librevenge::RVNGInputStream *inpu { if (input) { - xmlTextReaderPtr reader = xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER); + shared_ptr<xmlTextReader> reader(xmlReaderForStream(input, 0, 0, XML_PARSE_NOBLANKS|XML_PARSE_NOENT|XML_PARSE_NONET|XML_PARSE_RECOVER), xmlFreeTextReader); if (reader) { bool inRelationships = false; - int ret = xmlTextReaderRead(reader); + int ret = xmlTextReaderRead(reader.get()); while (ret == 1) { - const xmlChar *name = xmlTextReaderConstName(reader); + const xmlChar *name = xmlTextReaderConstName(reader.get()); if (name) { if (xmlStrEqual(name, BAD_CAST("Relationships"))) { - if (xmlTextReaderNodeType(reader) == 1) + if (xmlTextReaderNodeType(reader.get()) == 1) { // VSD_DEBUG_MSG(("Relationships ON\n")); inRelationships = true; } - else if (xmlTextReaderNodeType(reader) == 15) + else if (xmlTextReaderNodeType(reader.get()) == 15) { // VSD_DEBUG_MSG(("Relationships OFF\n")); inRelationships = false; @@ -291,15 +291,14 @@ libvisio::VSDXRelationships::VSDXRelationships(librevenge::RVNGInputStream *inpu { if (inRelationships) { - VSDXRelationship relationship(reader); + VSDXRelationship relationship(reader.get()); m_relsByType[relationship.getType()] = relationship; m_relsById[relationship.getId()] = relationship; } } } - ret = xmlTextReaderRead(reader); + ret = xmlTextReaderRead(reader.get()); } - xmlFreeTextReader(reader); } } } commit 1ffd6ef4ff54c47b65a78a44a9979083b54dba13 Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 18:48:23 2015 +0200 afl: avoid null pointer dereference Change-Id: I641e7ca93d903db3b2e211ec90e420dc249e162e diff --git a/src/lib/VSD5Parser.cpp b/src/lib/VSD5Parser.cpp index 95b0766..1f1cef0 100644 --- a/src/lib/VSD5Parser.cpp +++ b/src/lib/VSD5Parser.cpp @@ -132,7 +132,7 @@ void libvisio::VSD5Parser::handleChunkRecords(librevenge::RVNGInputStream *input void libvisio::VSD5Parser::readGeomList(librevenge::RVNGInputStream *input) { VSD_DEBUG_MSG(("VSD5Parser::readGeomList\n")); - if (!m_shape.m_geometries.empty() && m_currentGeometryList->empty()) + if (!m_shape.m_geometries.empty() && m_currentGeometryList && m_currentGeometryList->empty()) m_shape.m_geometries.erase(--m_currentGeomListCount); m_currentGeometryList = &m_shape.m_geometries[m_currentGeomListCount++]; commit 943728197d471f4a1554ff320ff42bf5cfaac324 Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 18:45:57 2015 +0200 afl: avoid null pointer dereference Change-Id: Ice2a9440ca6bfa4c032186a4a65d6ed2e537648a diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index 7c903ce..3cb284a 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -678,7 +678,7 @@ void libvisio::VSDParser::_handleLevelChange(unsigned level) return; if (level <= m_currentShapeLevel+1) { - if (!m_shape.m_geometries.empty() && m_currentGeometryList->empty()) + if (!m_shape.m_geometries.empty() && m_currentGeometryList && m_currentGeometryList->empty()) { m_shape.m_geometries.erase(--m_currentGeomListCount); m_currentGeometryList = 0; commit db36f1a63b9d046f437e44072f43ff9bedcbd283 Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 18:40:17 2015 +0200 afl: avoid null dereference Change-Id: I37a3295a82bdc29fa38cf24b8d5005d992699214 diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 23fc541..9cb62e6 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -421,7 +421,7 @@ void libvisio::VSDXParser::processXmlNode(xmlTextReaderPtr reader) readShapeProperties(reader); else { - if (m_isStencilStarted) + if (m_isStencilStarted && m_currentStencil) m_currentStencil->addStencilShape(m_shape.m_shapeId, m_shape); else _flushShape(); @@ -432,7 +432,7 @@ void libvisio::VSDXParser::processXmlNode(xmlTextReaderPtr reader) } else if (XML_READER_TYPE_END_ELEMENT == tokenType) { - if (m_isStencilStarted) + if (m_isStencilStarted && m_currentStencil) m_currentStencil->addStencilShape(m_shape.m_shapeId, m_shape); else { @@ -636,7 +636,7 @@ void libvisio::VSDXParser::readPageSheetProperties(xmlTextReaderPtr reader) } while ((XML_PAGESHEET != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); - if (m_isStencilStarted) + if (m_isStencilStarted && m_currentStencil) { m_currentStencil->m_shadowOffsetX = shadowOffsetX; m_currentStencil->m_shadowOffsetY = shadowOffsetY; commit 75d144e106c82aeaa610be1279215b0a4d0b1c5b Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 18:39:02 2015 +0200 afl: avoid null dereference Change-Id: I34cd4745be84a77ba2a380f0821712b8f439ccbc diff --git a/src/lib/VSD6Parser.cpp b/src/lib/VSD6Parser.cpp index 35e152c..9e845eb 100644 --- a/src/lib/VSD6Parser.cpp +++ b/src/lib/VSD6Parser.cpp @@ -234,7 +234,7 @@ void libvisio::VSD6Parser::readFillAndShadow(librevenge::RVNGInputStream *input) { double shadowOffsetX = 0.0; double shadowOffsetY = 0.0; - if (m_isStencilStarted) + if (m_isStencilStarted && m_currentStencil) { VSD_DEBUG_MSG(("Found stencil fill\n")); shadowOffsetX = m_currentStencil->m_shadowOffsetX; commit f9286b5b5d183bbdb34a92e42d484992a3b3385e Author: David Tardon <dtar...@redhat.com> Date: Wed Jul 15 17:24:10 2015 +0200 afl: don't leave dangling pointer around Change-Id: I9ad2c1711954d8fe9164c8d51d288e1aa04c8372 diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index 9e75485..7c903ce 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -679,7 +679,10 @@ void libvisio::VSDParser::_handleLevelChange(unsigned level) if (level <= m_currentShapeLevel+1) { if (!m_shape.m_geometries.empty() && m_currentGeometryList->empty()) + { m_shape.m_geometries.erase(--m_currentGeomListCount); + m_currentGeometryList = 0; + } m_collector->collectShapesOrder(0, m_currentShapeLevel+2, m_shapeList.getShapesOrder()); m_shapeList.clear(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits