[libmusicbrainz5/f18] Fix bug in libxml patch

Christophe Fergeau teuf at fedoraproject.org
Wed Apr 3 19:56:03 UTC 2013


commit 5a18ead88230427c3291035e98b68358ae5fa9f4
Author: Christophe Fergeau <cfergeau at redhat.com>
Date:   Wed Apr 3 21:27:02 2013 +0200

    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)

 0001-xmlparsing.patch |  428 +++++++++++++++++++++++++------------------------
 1 files changed, 216 insertions(+), 212 deletions(-)
---
diff --git a/0001-xmlparsing.patch b/0001-xmlparsing.patch
index 465f767..0cadff4 100644
--- a/0001-xmlparsing.patch
+++ b/0001-xmlparsing.patch
@@ -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})


More information about the scm-commits mailing list