Fix bug in libxml patch

See http://tickets.musicbrainz.org/browse/LMB-34?focusedCommentId=27184
and http://lists.musicbrainz.org/pipermail/musicbrainz-devel/2013-March/005191.html

The xmlError structure were not initialized before being used, causing
use of unitialized memory, and then failure of the test case
(use of -D_FORTIFY_SOURCE=2 seemed to make a difference on the test
case behaviour)
This commit is contained in:
Christophe Fergeau 2013-04-03 21:27:02 +02:00
parent e387f44242
commit 0ac7e2a2da

View File

@ -1,7 +1,8 @@
diff -up libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/CMakeLists.txt
--- libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/CMakeLists.txt 2013-01-07 12:51:33.916020435 -0500
@@ -20,6 +20,7 @@ SET(musicbrainz5_SOVERSION ${musicbrainz
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16870b4..a1f5a65 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,6 +20,7 @@ SET(musicbrainz5_SOVERSION ${musicbrainz5_SOVERSION_MAJOR})
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
FIND_PACKAGE(Neon REQUIRED)
@ -9,9 +10,10 @@ diff -up libmusicbrainz-5.0.1/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/CMak
SET(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
SET(EXEC_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Installation prefix for executables and object code libraries" FORCE)
diff -up libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/examples/CMakeLists.txt
--- libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/examples/CMakeLists.txt 2013-01-07 12:51:33.917020435 -0500
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 3e11469..440d4f2 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,5 +1,5 @@
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
-LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES})
@ -20,9 +22,10 @@ diff -up libmusicbrainz-5.0.1/examples/CMakeLists.txt.xmlParser libmusicbrainz-5
ADD_EXECUTABLE(cdlookup cdlookup.cc)
ADD_EXECUTABLE(cdlookup_c cdlookup_c.c)
diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h
--- libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h 2013-01-07 12:51:33.918020435 -0500
diff --git a/include/musicbrainz5/xmlParser.h b/include/musicbrainz5/xmlParser.h
index 56b29d7..45db5fc 100644
--- a/include/musicbrainz5/xmlParser.h
+++ b/include/musicbrainz5/xmlParser.h
@@ -1,733 +1,111 @@
-/****************************************************************************/
-/*! \mainpage XMLParser library
@ -108,12 +111,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * work.has been done.
- *
- ****************************************************************************/
-
+/* --------------------------------------------------------------------------
-#ifndef __INCLUDE_XML_NODE__
-#define __INCLUDE_XML_NODE__
-
+ libmusicbrainz5 - Client library to access MusicBrainz
-#include <stdlib.h>
-
+ Copyright (C) 2012 Christophe Fergeau
-#ifdef _UNICODE
-// If you comment the next "define" line then the library will never "switch to" _UNICODE (wchar_t*) mode (16/32 bits per characters).
-// This is useful when you get error messages like:
@ -122,14 +128,12 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-// must be defined) or utf8-mode(the pre-processor variable must be undefined).
-#define _XMLWIDECHAR
-#endif
+/* --------------------------------------------------------------------------
-
-#if defined(WIN32) || defined(UNDER_CE) || defined(_WIN32) || defined(WIN64) || defined(__BORLANDC__)
-// comment the next line if you are under windows and the compiler is not Microsoft Visual Studio (6.0 or .NET) or Borland
-#define _XMLWINDOWS
-#endif
+ libmusicbrainz5 - Client library to access MusicBrainz
-
-#ifdef XMLDLLENTRY
-#undef XMLDLLENTRY
-#endif
@ -142,19 +146,22 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-#else
-#define XMLDLLENTRY
-#endif
+ Copyright (C) 2012 Christophe Fergeau
+ This file is part of libmusicbrainz5.
-// uncomment the next line if you want no support for wchar_t* (no need for the <wchar.h> or <tchar.h> libraries anymore to compile)
-//#define XML_NO_WIDE_CHAR
+ This file is part of libmusicbrainz5.
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of v2 of the GNU Lesser General Public
+ License as published by the Free Software Foundation.
-#ifdef XML_NO_WIDE_CHAR
-#undef _XMLWINDOWS
-#undef _XMLWIDECHAR
-#endif
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of v2 of the GNU Lesser General Public
+ License as published by the Free Software Foundation.
+ libmusicbrainz5 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
-#ifdef _XMLWINDOWS
-#include <tchar.h>
@ -165,10 +172,8 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- // to have 'mbsrtowcs' for WIDECHAR version
-#endif
-#endif
+ libmusicbrainz5 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with this library. If not, see <http://www.gnu.org/licenses/>.
-// Some common types for char set portable code
-#ifdef _XMLWIDECHAR
@ -188,27 +193,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
-#ifndef TRUE
- #define TRUE 1
-#endif /* TRUE */
+ You should have received a copy of the GNU General Public License
+ along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ $Id$
+
+----------------------------------------------------------------------------*/
+#ifndef _MUSICBRAINZ5_XMLPARSER_H
+#define _MUSICBRAINZ5_XMLPARSER_H
+
+#include <string>
+#include <libxml/tree.h>
+
+typedef xmlError XMLResults;
+const int eXMLErrorNone = 0;
-/// Enumeration for XML parse errors.
-typedef enum XMLError
+class XMLAttribute;
+class XMLNode
{
-{
- eXMLErrorNone = 0,
- eXMLErrorMissingEndTag,
- eXMLErrorNoXMLTagFound,
@ -232,47 +225,26 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- eXMLErrorBase64DecodeTruncatedData,
- eXMLErrorBase64DecodeBufferTooSmall
-} XMLError;
+ public:
+ static XMLNode emptyNode();
+ bool isEmpty() const;
+#include <string>
+#include <libxml/tree.h>
+ virtual ~XMLNode() {};
+typedef xmlError XMLResults;
-/// Enumeration used to manage type of data. Use in conjunction with structure XMLNodeContents
-typedef enum XMLElementType
+ const XMLAttribute getAttribute(const char *name = NULL) const;
+ bool isAttributeSet(const char *name) const;
+
+ XMLNode getChildNode(const char *name = NULL) const;
+ XMLNode next() const;
+ const char *getName() const;
+ const char *getText() const;
+
+ friend bool operator== (const XMLNode &lhs, const XMLNode &rhs);
+
+ protected:
+ XMLNode(xmlNodePtr node): mNode(node) {};
+
+ xmlNodePtr mNode;
+
+ private:
+ xmlAttrPtr getAttributeRaw(const char *name) const;
+};
+
+inline bool operator== (const XMLNode &lhs, const XMLNode &rhs)
{
-{
- eNodeChild=0,
- eNodeAttribute=1,
- eNodeText=2,
- eNodeClear=3,
- eNodeNULL=4
-} XMLElementType;
+ return (lhs.mNode == rhs.mNode);
+}
+const int eXMLErrorNone = 0;
-/// Structure used to obtain error details if the parse fails.
-typedef struct XMLResults
+inline bool operator!= (const XMLNode &lhs, const XMLNode &rhs)
+class XMLAttribute;
+class XMLNode
{
- enum XMLError error;
- int nLine,nColumn;
@ -306,19 +278,11 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * <li> XMLNode::createXMLTopNode (or XMLNode::createXMLTopNode_WOSD)</li>
- * </ul> */
-typedef struct XMLDLLENTRY XMLNode
+ return !(lhs == rhs);
+}
+
+class XMLRootNode: public XMLNode
{
-{
- private:
+ public:
+ static XMLNode* parseString(std::string &xml, XMLResults *results);
+ static XMLNode* parseFile(const std::string &filename, XMLResults *results);
-
- struct XMLNodeDataTag;
+ virtual ~XMLRootNode() { if (mDoc != NULL) xmlFreeDoc(mDoc); };
-
- /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode
- XMLNode(struct XMLNodeDataTag *pParent, XMLSTR lpszName, char isDeclaration);
- /// Constructors are protected, so use instead one of: XMLNode::parseString, XMLNode::parseFile, XMLNode::openFileHelper, XMLNode::createXMLTopNode
@ -356,7 +320,10 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>).
- * @param pResults a pointer to a XMLResults variable that will contain some information that can be used to trace the XML parsing error. You can have a user-friendly explanation of the parsing error with the "getError" function.
- */
-
+ public:
+ static XMLNode emptyNode();
+ bool isEmpty() const;
- /// Parse an XML file and return the root of a XMLNode tree representing the file. A very crude error checking is made. An attempt to guess the Char Encoding used in the file is made.
- static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=NULL);
- /**< The "openFileHelper" function reports to the screen all the warnings and errors that occurred during parsing of the XML file.
@ -375,16 +342,23 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * @param filename the path of the XML file to parse.
- * @param tag the name of the first tag inside the XML file. If the tag parameter is omitted, this function returns a node that represents the head of the xml document including the declaration term (<? ... ?>).
- */
-
+ virtual ~XMLNode() {};
- static XMLCSTR getError(XMLError error); ///< this gives you a user-friendly explanation of the parsing error
-
+ const XMLAttribute getAttribute(const char *name = NULL) const;
+ bool isAttributeSet(const char *name) const;
- /// Create an XML string starting from the current XMLNode.
- XMLSTR createXMLString(int nFormat=1, int *pnSize=NULL) const;
- /**< The returned string should be free'd using the "freeXMLString" function.
- *
- * If nFormat==0, no formatting is required otherwise this returns an user friendly XML string from a given element
- * with appropriate white spaces and carriage returns. if pnSize is given it returns the size in character of the string. */
-
+ XMLNode getChildNode(const char *name = NULL) const;
+ XMLNode next() const;
+ const char *getName() const;
+ const char *getText() const;
- /// Save the content of an xmlNode inside a file
- XMLError writeToFile(XMLCSTR filename,
- const char *encoding=NULL,
@ -395,7 +369,8 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * If "_XMLWIDECHAR=1", then the "encoding" parameter is ignored and always set to "utf-16".
- * If no "encoding" parameter is given the "ISO-8859-1" encoding is used. */
- /** @} */
-
+ friend bool operator== (const XMLNode &lhs, const XMLNode &rhs);
- /** @defgroup navigate Navigate the XMLNode structure
- * @ingroup XMLParserGeneral
- * @{ */
@ -414,7 +389,9 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- ///< return the first child node with specific path
- XMLNode getChildNodeByPathNonConst(XMLSTR path, char createNodeIfMissing=0, XMLCHAR sep='/');
- ///< return the first child node with specific path.
-
+ protected:
+ XMLNode(xmlNodePtr node): mNode(node) {};
- int nChildNode(XMLCSTR name) const; ///< return the number of child node with specific name
- int nChildNode() const; ///< nbr of child node
- XMLAttribute getAttribute(int i=0) const; ///< return ith attribute
@ -433,11 +410,15 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- XMLNode deepCopy() const; ///< deep copy (duplicate/clone) a XMLNode
- static XMLNode emptyNode(); ///< return XMLNode::emptyXMLNode;
- /** @} */
-
+ xmlNodePtr mNode;
- ~XMLNode();
- XMLNode(const XMLNode &A); ///< to allow shallow/fast copy:
- XMLNode& operator=( const XMLNode& A ); ///< to allow shallow/fast copy:
-
+ private:
+ xmlAttrPtr getAttributeRaw(const char *name) const;
+};
- XMLNode(): d(NULL){};
- static XMLNode emptyXMLNode;
- static XMLClear emptyXMLClear;
@ -684,12 +665,11 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- static void exactMemory(XMLNodeData *d);
- static int detachFromParent(XMLNodeData *d);
-} XMLNode;
+ private:
+ XMLRootNode(xmlDocPtr doc);
-
-/// This structure is given by the function XMLNode::enumContents.
-typedef struct XMLNodeContents
-{
+inline bool operator== (const XMLNode &lhs, const XMLNode &rhs)
{
- /// This dictates what's the content of the XMLNodeContent
- enum XMLElementType etype;
- /**< should be an union to access the appropriate data. Compiler does not allow union of object with constructor... too bad. */
@ -709,7 +689,9 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * a very handy function when used with all the "XMLNode::*_WOSD" functions (\link xmlWOSD \endlink).
- * @param cbData If !=0 then cbData is the number of chars to duplicate. New strings allocated with
- * this function should be free'd using the "freeXMLString" function. */
-
+ return (lhs.mNode == rhs.mNode);
+}
-/// to free the string allocated inside the "stringDup" function or the "createXMLString" function.
-XMLDLLENTRY void freeXMLString(XMLSTR t); // {free(t);}
-/** @} */
@ -745,14 +727,17 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * you must not use the "ToXMLStringTool" class (because the "XMLNode" class does the
- * processing job for you during rendering).*/
-typedef struct XMLDLLENTRY ToXMLStringTool
-{
+inline bool operator!= (const XMLNode &lhs, const XMLNode &rhs)
{
-public:
- ToXMLStringTool(): buf(NULL),buflen(0){}
- ~ToXMLStringTool();
- void freeBuffer();///<call this function when you have finished using this object to release memory used by the internal buffer.
-
- XMLSTR toXML(XMLCSTR source);///< returns a pointer to an internal buffer that contains a XML-encoded string based on the "source" parameter.
-
+ return !(lhs == rhs);
+}
- /** The "toXMLUnSafe" function is deprecated because there is a possibility of
- * "destination-buffer-overflow". It converts the string
- * "source" to the string "dest". */
@ -778,10 +763,7 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- * functions can also be used to "encrypt/decrypt" some critical data contained inside
- * the XML (it's not a strong encryption at all, but sometimes it can be useful). */
-typedef struct XMLDLLENTRY XMLParserBase64Tool
+ mutable xmlDocPtr mDoc;
+};
+
+class XMLAttribute
+class XMLRootNode: public XMLNode
{
-public:
- XMLParserBase64Tool(): buf(NULL),buflen(0){}
@ -791,24 +773,32 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- /**
- * @param formatted If "formatted"=true, some space will be reserved for a carriage-return every 72 chars. */
- static int encodeLength(int inBufLen, char formatted=0); ///< return the length of the base64 string that encodes a data buffer of size inBufLen bytes.
-
+ public:
+ static XMLNode* parseString(std::string &xml, XMLResults *results);
+ static XMLNode* parseFile(const std::string &filename, XMLResults *results);
- /**
- * The "base64Encode" function returns a string containing the base64 encoding of "inByteLen" bytes
- * from "inByteBuf". If "formatted" parameter is true, then there will be a carriage-return every 72 chars.
- * The string will be free'd when the XMLParserBase64Tool object is deleted.
- * All returned strings are sharing the same memory space. */
- XMLSTR encode(unsigned char *inByteBuf, unsigned int inByteLen, char formatted=0); ///< returns a pointer to an internal buffer containing the base64 string containing the binary data encoded from "inByteBuf"
-
+ virtual ~XMLRootNode() { if (mDoc != NULL) xmlFreeDoc(mDoc); };
- /// returns the number of bytes which will be decoded from "inString".
- static unsigned int decodeSize(XMLCSTR inString, XMLError *xe=NULL);
-
+ private:
+ XMLRootNode(xmlDocPtr doc);
- /**
- * The "decode" function returns a pointer to a buffer containing the binary data decoded from "inString"
- * The output buffer will be free'd when the XMLParserBase64Tool object is deleted.
- * All output buffer are sharing the same memory space.
- * @param inString If "instring" is malformed, NULL will be returned */
- unsigned char* decode(XMLCSTR inString, int *outByteLen=NULL, XMLError *xe=NULL); ///< returns a pointer to an internal buffer containing the binary data decoded from "inString"
-
+ mutable xmlDocPtr mDoc;
+};
- /**
- * decodes data from "inString" to "outByteBuf". You need to provide the size (in byte) of "outByteBuf"
- * in "inMaxByteOutBuflen". If "outByteBuf" is not large enough or if data is malformed, then "FALSE"
@ -821,6 +811,10 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
- void alloc(int newsize);
-}XMLParserBase64Tool;
-/** @} */
-
-#undef XMLDLLENTRY
+class XMLAttribute
+{
+ public:
+ bool isEmpty() const {
+ return (mAttr == NULL);
@ -838,18 +832,18 @@ diff -up libmusicbrainz-5.0.1/include/musicbrainz5/xmlParser.h.xmlParser libmusi
+ }
+
+ friend const XMLAttribute XMLNode::getAttribute(const char *name) const;
-#undef XMLDLLENTRY
+
+ private:
+ XMLAttribute(xmlAttrPtr attr): mAttr(attr) {};
+ xmlAttrPtr mAttr;
+};
#endif
diff -up libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake
--- libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake 2013-01-07 12:51:33.918020435 -0500
@@ -8,6 +8,7 @@ Description: The Musicbrainz Client Libr
diff --git a/libmusicbrainz5.pc.cmake b/libmusicbrainz5.pc.cmake
index c2f45c9..fca0de1 100644
--- a/libmusicbrainz5.pc.cmake
+++ b/libmusicbrainz5.pc.cmake
@@ -8,6 +8,7 @@ Description: The Musicbrainz Client Library.
URL: http://musicbrainz.org/doc/libmusicbrainz
Version: ${PROJECT_VERSION}
Requires.private: neon >= 0.25
@ -857,35 +851,10 @@ diff -up libmusicbrainz-5.0.1/libmusicbrainz5.pc.cmake.xmlParser libmusicbrainz-
Libs: -L${LIB_INSTALL_DIR} -lmusicbrainz5
Cflags: -I${INCLUDE_INSTALL_DIR}
diff -up libmusicbrainz-5.0.1/src/cinterface.xml.xmlParser libmusicbrainz-5.0.1/src/cinterface.xml
--- libmusicbrainz-5.0.1/src/cinterface.xml.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/cinterface.xml 2013-01-07 12:52:21.992035823 -0500
@@ -1,5 +1,4 @@
<!--
- --------------------------------------------------------------------------
libmusicbrainz5 - Client library to access MusicBrainz
@@ -21,7 +20,6 @@
$Id$
-----------------------------------------------------------------------------
-->
<cinterface>
@@ -218,7 +216,7 @@ extern "C"
<property name="artist" type="string"/>
<property name="length" type="integer"/>
</class>
- <class name="puid" uppername="PUID" uppername="PUID">
+ <class name="puid" uppername="PUID">
<property name="id" uppername="ID" type="string"/>
<property name="recordinglist" uppername="RecordingList" type="object"/>
</class>
diff -up libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/src/CMakeLists.txt
--- libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/CMakeLists.txt 2013-01-07 12:51:33.919020436 -0500
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2ee102f..368dd93 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,14 +1,15 @@
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/../include ${NEON_INCLUDE_DIR})
@ -923,10 +892,11 @@ diff -up libmusicbrainz-5.0.1/src/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
INSTALL(TARGETS musicbrainz5 DESTINATION ${LIB_INSTALL_DIR})
diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/Entity.cc
--- libmusicbrainz-5.0.1/src/Entity.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/Entity.cc 2013-01-07 12:51:33.919020436 -0500
@@ -80,10 +80,12 @@ void MusicBrainz5::CEntity::Parse(const
diff --git a/src/Entity.cc b/src/Entity.cc
index 0644377..a1bb1ca 100644
--- a/src/Entity.cc
+++ b/src/Entity.cc
@@ -80,10 +80,12 @@ void MusicBrainz5::CEntity::Parse(const XMLNode& Node)
{
if (!Node.isEmpty())
{
@ -942,7 +912,7 @@ diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/E
if ("ext:"==Name.substr(0,4))
m_d->m_ExtAttributes[Name.substr(4)]=Value;
@@ -93,10 +95,10 @@ void MusicBrainz5::CEntity::Parse(const
@@ -93,10 +95,10 @@ void MusicBrainz5::CEntity::Parse(const XMLNode& Node)
//std::cout << "Node: " << std::endl << Node.createXMLString(true) << std::endl;
@ -956,29 +926,107 @@ diff -up libmusicbrainz-5.0.1/src/Entity.cc.xmlParser libmusicbrainz-5.0.1/src/E
std::string Name=ChildNode.getName();
std::string Value;
if (ChildNode.getText())
diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5.0.1/src/make-c-interface.cc
--- libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/make-c-interface.cc 2013-01-07 12:51:33.920020438 -0500
@@ -28,6 +28,7 @@
diff --git a/src/Query.cc b/src/Query.cc
index d132ae7..a835c84 100644
--- a/src/Query.cc
+++ b/src/Query.cc
@@ -158,15 +158,17 @@ MusicBrainz5::CMetadata MusicBrainz5::CQuery::PerformQuery(const std::string& Qu
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ memset(&Results, 0, sizeof(Results));
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
Metadata=CMetadata(MetadataNode);
}
}
+ delete TopNode;
}
}
@@ -393,10 +395,11 @@ bool MusicBrainz5::CQuery::EditCollection(const std::string& CollectionID, const
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ memset(&Results, 0, sizeof(Results));
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
CMetadata Metadata(MetadataNode);
@@ -405,6 +408,7 @@ bool MusicBrainz5::CQuery::EditCollection(const std::string& CollectionID, const
RetVal=RetVal && true;
}
}
+ delete TopNode;
}
}
diff --git a/src/cinterface.xml b/src/cinterface.xml
index ae5cf92..f492fd1 100644
--- a/src/cinterface.xml
+++ b/src/cinterface.xml
@@ -1,5 +1,4 @@
<!--
- --------------------------------------------------------------------------
libmusicbrainz5 - Client library to access MusicBrainz
@@ -21,7 +20,6 @@
$Id$
-----------------------------------------------------------------------------
-->
<cinterface>
@@ -218,7 +216,7 @@ extern "C"
<property name="artist" type="string"/>
<property name="length" type="integer"/>
</class>
- <class name="puid" uppername="PUID" uppername="PUID">
+ <class name="puid" uppername="PUID">
<property name="id" uppername="ID" type="string"/>
<property name="recordinglist" uppername="RecordingList" type="object"/>
</class>
diff --git a/src/make-c-interface.cc b/src/make-c-interface.cc
index 652a65b..97af3d9 100644
--- a/src/make-c-interface.cc
+++ b/src/make-c-interface.cc
@@ -28,6 +28,8 @@
#include <iostream>
#include <fstream>
#include <sstream>
+#include <cstring>
+#include <unistd.h>
#include <vector>
#include <string>
@@ -51,8 +52,8 @@ int main(int argc, const char *argv[])
@@ -51,8 +53,9 @@ int main(int argc, const char *argv[])
{
std::string XMLFile=std::string(argv[1])+"/"+argv[2];
XMLResults Results;
- XMLNode TopNode=XMLNode::parseFile(XMLFile.c_str(),"cinterface",&Results);
- if (!TopNode.isEmpty())
+ XMLNode *TopNode=XMLRootNode::parseFile(XMLFile.c_str(),&Results);
+ memset(&Results, 0, sizeof(Results));
+ if (!TopNode->isEmpty())
{
std::cout << "Generating '" << argv[3] << "/" << argv[4] << "' and '" << argv[3] << "/" << argv[5] << "'" << std::endl;
@@ -74,9 +75,10 @@ int main(int argc, const char *argv[])
@@ -74,9 +77,10 @@ int main(int argc, const char *argv[])
return 1;
}
@ -991,7 +1039,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
std::string Name=Node.getName();
if ("boilerplate"==Name)
@@ -84,7 +86,7 @@ int main(int argc, const char *argv[])
@@ -84,7 +88,7 @@ int main(int argc, const char *argv[])
else if ("header"==Name)
ProcessHeader(Node,Source,Include);
else if ("declare"==Name)
@ -1000,7 +1048,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else if ("entity"==Name)
ProcessEntity(Node,Source,Include);
else if ("class"==Name)
@@ -100,9 +102,11 @@ int main(int argc, const char *argv[])
@@ -100,9 +104,11 @@ int main(int argc, const char *argv[])
}
else
{
@ -1013,7 +1061,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
}
return 0;
@@ -114,7 +118,7 @@ std::ofstream *GetFile(const XMLNode& No
@@ -114,7 +120,7 @@ std::ofstream *GetFile(const XMLNode& Node, std::ofstream& Source, std::ofstream
if (Node.isAttributeSet("target"))
{
@ -1022,7 +1070,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("source"==Target)
File=&Source;
else if ("include"==Target)
@@ -162,7 +166,7 @@ void ProcessBoilerplate(const XMLNode& N
@@ -162,7 +168,7 @@ void ProcessBoilerplate(const XMLNode& Node, std::ofstream& Source, std::ofstrea
if (Node.isAttributeSet("file"))
{
@ -1031,7 +1079,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
std::ifstream InFile(FileName.c_str());
if (InFile.is_open())
*File << InFile.rdbuf() << std::endl;
@@ -263,11 +267,11 @@ void ProcessClass(const XMLNode& Node, s
@@ -263,11 +269,11 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
{
if (Node.isAttributeSet("name"))
{
@ -1045,7 +1093,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else
UpperName[0]=toupper(UpperName[0]);
@@ -294,24 +298,25 @@ void ProcessClass(const XMLNode& Node, s
@@ -294,24 +300,25 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
Source << " MB5_C_CLONE(" << UpperName << "," << LowerName << ")" << std::endl;
@ -1076,7 +1124,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("string"==PropertyType)
{
@@ -320,13 +325,13 @@ void ProcessClass(const XMLNode& Node, s
@@ -320,13 +327,13 @@ void ProcessClass(const XMLNode& Node, std::ofstream& Source, std::ofstream& Inc
if (ChildNode.isAttributeSet("deprecated"))
{
@ -1092,7 +1140,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
}
Include << "/**" << std::endl;
@@ -470,11 +475,11 @@ void ProcessList(const XMLNode& Node, st
@@ -470,11 +477,11 @@ void ProcessList(const XMLNode& Node, std::ofstream& Source, std::ofstream& Incl
{
if (Node.isAttributeSet("name"))
{
@ -1106,7 +1154,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else
UpperName[0]=toupper(UpperName[0]);
@@ -532,24 +537,25 @@ void ProcessList(const XMLNode& Node, st
@@ -532,24 +539,25 @@ void ProcessList(const XMLNode& Node, std::ofstream& Source, std::ofstream& Incl
Source << " MB5_C_CLONE(" << UpperName << "List," << LowerName << "_list)" << std::endl;
@ -1137,7 +1185,7 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
if ("string"==PropertyType)
{
@@ -637,18 +643,19 @@ void ProcessDeclare(const XMLNode& Node,
@@ -637,18 +645,19 @@ void ProcessDeclare(const XMLNode& Node, std::ofstream& /*Source*/, std::ofstrea
std::vector<std::string> Classes;
Classes.push_back("Entity");
@ -1161,55 +1209,12 @@ diff -up libmusicbrainz-5.0.1/src/make-c-interface.cc.xmlParser libmusicbrainz-5
else
UpperName[0]=toupper(UpperName[0]);
diff -up libmusicbrainz-5.0.1/src/Query.cc.xmlParser libmusicbrainz-5.0.1/src/Query.cc
--- libmusicbrainz-5.0.1/src/Query.cc.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/src/Query.cc 2013-01-07 12:51:33.921020440 -0500
@@ -158,15 +158,16 @@ MusicBrainz5::CMetadata MusicBrainz5::CQ
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
Metadata=CMetadata(MetadataNode);
}
}
+ delete TopNode;
}
}
@@ -393,10 +394,10 @@ bool MusicBrainz5::CQuery::EditCollectio
#endif
XMLResults Results;
- XMLNode TopNode=XMLNode::parseString(strData.c_str(), 0, &Results);
- if (Results.error==eXMLErrorNone)
+ XMLNode *TopNode = XMLRootNode::parseString(strData, &Results);
+ if (Results.code==eXMLErrorNone)
{
- XMLNode MetadataNode=TopNode.getChildNode("metadata");
+ XMLNode MetadataNode=*TopNode;
if (!MetadataNode.isEmpty())
{
CMetadata Metadata(MetadataNode);
@@ -405,6 +406,7 @@ bool MusicBrainz5::CQuery::EditCollectio
RetVal=RetVal && true;
}
}
+ delete TopNode;
}
}
diff -up libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser libmusicbrainz-5.0.1/src/xmlParser.cc
--- libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser 2013-01-07 12:51:33.921020440 -0500
+++ libmusicbrainz-5.0.1/src/xmlParser.cc 2013-01-07 12:51:33.921020440 -0500
@@ -0,0 +1,147 @@
diff --git a/src/xmlParser.cc b/src/xmlParser.cc
new file mode 100644
index 0000000..41af44b
--- /dev/null
+++ b/src/xmlParser.cc
@@ -0,0 +1,145 @@
+/* --------------------------------------------------------------------------
+
+ libmusicbrainz5 - Client library to access MusicBrainz
@ -1355,11 +1360,10 @@ diff -up libmusicbrainz-5.0.1/src/xmlParser.cc.xmlParser libmusicbrainz-5.0.1/sr
+{
+ return mNode == NULL;
+}
+
+
diff -up libmusicbrainz-5.0.1/tests/CMakeLists.txt.xmlParser libmusicbrainz-5.0.1/tests/CMakeLists.txt
--- libmusicbrainz-5.0.1/tests/CMakeLists.txt.xmlParser 2012-05-16 15:48:34.000000000 -0400
+++ libmusicbrainz-5.0.1/tests/CMakeLists.txt 2013-01-07 12:51:33.922020441 -0500
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 645f8ae..8dd569c 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,5 +1,5 @@
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include)
-LINK_LIBRARIES(musicbrainz5 ${NEON_LIBRARIES})