Blame SOURCES/0001-cleanup-and-fix-libxml2-backend.patch

d3a132
From 22c63b6ca838d257ce6b044fd893f3374d038e3f Mon Sep 17 00:00:00 2001
d3a132
From: Igor Gnatenko <i.gnatenko.brain@gmail.com>
d3a132
Date: Sun, 18 Dec 2016 11:49:03 +0100
d3a132
Subject: [PATCH] cleanup and fix libxml2 backend
d3a132
d3a132
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
d3a132
---
d3a132
 src/xmlrpc_libxml2.c | 138 +++++++++++++++++++++++++++------------------------
d3a132
 1 file changed, 73 insertions(+), 65 deletions(-)
d3a132
d3a132
diff --git a/src/xmlrpc_libxml2.c b/src/xmlrpc_libxml2.c
d3a132
index 207036ff..bf3d6914 100644
d3a132
--- a/src/xmlrpc_libxml2.c
d3a132
+++ b/src/xmlrpc_libxml2.c
d3a132
@@ -43,14 +43,15 @@
d3a132
 #include "xmlrpc-c/base.h"
d3a132
 #include "xmlrpc-c/base_int.h"
d3a132
 #include "xmlrpc-c/string_int.h"
d3a132
+#include "xmlrpc-c/util.h"
d3a132
 
d3a132
 #include "xmlparser.h"
d3a132
 
d3a132
 struct _xml_element {
d3a132
     xml_element * parentP;
d3a132
     const char * name;
d3a132
-    xmlrpc_mem_block cdata;    /* char */
d3a132
-    xmlrpc_mem_block children; /* xml_element* */
d3a132
+    xmlrpc_mem_block * cdataP;    /* char */
d3a132
+    xmlrpc_mem_block * childrenP; /* xml_element* */
d3a132
 };
d3a132
 
d3a132
 #define XMLRPC_ASSERT_ELEM_OK(elem) \
d3a132
@@ -102,7 +103,7 @@ xmlElementNew(xmlrpc_env * const envP,
d3a132
     bool childrenAreValid;
d3a132
 
d3a132
     XMLRPC_ASSERT_ENV_OK(envP);
d3a132
-    assert(name != NULL);
d3a132
+    XMLRPC_ASSERT(name != NULL);
d3a132
 
d3a132
     /* Set up our error-handling preconditions. */
d3a132
     retval = NULL;
d3a132
@@ -112,21 +113,20 @@ xmlElementNew(xmlrpc_env * const envP,
d3a132
     XMLRPC_FAIL_IF_NULL(retval, envP, XMLRPC_INTERNAL_ERROR,
d3a132
                         "Couldn't allocate memory for XML element");
d3a132
 
d3a132
+    /* Set our parent field to NULL. */
d3a132
     retval->parentP = NULL;
d3a132
-    
d3a132
+
d3a132
     /* Copy over the element name. */
d3a132
-    retval->name = strdup(name);
d3a132
+    retval->name = xmlrpc_strdupnull(name);
d3a132
     XMLRPC_FAIL_IF_NULL(retval->name, envP, XMLRPC_INTERNAL_ERROR,
d3a132
                         "Couldn't allocate memory for XML element");
d3a132
     nameIsValid = true;
d3a132
 
d3a132
-    /* Initialize a block to hold our CDATA. */
d3a132
-    XMLRPC_TYPED_MEM_BLOCK_INIT(char, envP, &retval->cdata, 0);
d3a132
+    retval->cdataP = XMLRPC_MEMBLOCK_NEW(char, envP, 0);
d3a132
     XMLRPC_FAIL_IF_FAULT(envP);
d3a132
     cdataIsValid = true;
d3a132
 
d3a132
-    /* Initialize a block to hold our child elements. */
d3a132
-    XMLRPC_TYPED_MEM_BLOCK_INIT(xml_element *, envP, &retval->children, 0);
d3a132
+    retval->childrenP = XMLRPC_MEMBLOCK_NEW(xml_element *, envP, 0);
d3a132
     XMLRPC_FAIL_IF_FAULT(envP);
d3a132
     childrenAreValid = true;
d3a132
 
d3a132
@@ -136,48 +136,50 @@ cleanup:
d3a132
             if (nameIsValid)
d3a132
                 xmlrpc_strfree(retval->name);
d3a132
             if (cdataIsValid)
d3a132
-                xmlrpc_mem_block_clean(&retval->cdata);
d3a132
+                XMLRPC_MEMBLOCK_FREE(char, retval->cdataP);
d3a132
             if (childrenAreValid)
d3a132
-                xmlrpc_mem_block_clean(&retval->children);
d3a132
+                XMLRPC_MEMBLOCK_FREE(xml_element *, retval->childrenP);
d3a132
             free(retval);
d3a132
         }
d3a132
-        retval = NULL;
d3a132
+        return NULL;
d3a132
+    } else {
d3a132
+        return retval;
d3a132
     }
d3a132
-    return retval;
d3a132
 }
d3a132
 
d3a132
 
d3a132
-
d3a132
+/*=========================================================================
d3a132
+**  xml_element_free
d3a132
+**=========================================================================
d3a132
+**  Blow away an existing element & all of its child elements.
d3a132
+*/
d3a132
 void
d3a132
 xml_element_free(xml_element * const elemP) {
d3a132
-/*----------------------------------------------------------------------------
d3a132
-  Blow away an existing element & all of its child elements.
d3a132
------------------------------------------------------------------------------*/
d3a132
-    xmlrpc_mem_block * children;
d3a132
-    unsigned int size;
d3a132
-    unsigned int i;
d3a132
+
d3a132
+    xmlrpc_mem_block * childrenP;
d3a132
+    size_t size, i;
d3a132
     xml_element ** contents;
d3a132
 
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
 
d3a132
     xmlrpc_strfree(elemP->name);
d3a132
     elemP->name = XMLRPC_BAD_POINTER;
d3a132
-    xmlrpc_mem_block_clean(&elemP->cdata);
d3a132
+
d3a132
+    XMLRPC_MEMBLOCK_FREE(char, elemP->cdataP);
d3a132
 
d3a132
     /* Deallocate all of our children recursively. */
d3a132
-    children = &elemP->children;
d3a132
-    contents = XMLRPC_TYPED_MEM_BLOCK_CONTENTS(xml_element *, children);
d3a132
-    size = XMLRPC_TYPED_MEM_BLOCK_SIZE(xml_element *, children);
d3a132
+    childrenP = elemP->childrenP;
d3a132
+    contents = XMLRPC_MEMBLOCK_CONTENTS(xml_element *, childrenP);
d3a132
+    size = XMLRPC_MEMBLOCK_SIZE(xml_element *, childrenP);
d3a132
     for (i = 0; i < size; ++i)
d3a132
         xml_element_free(contents[i]);
d3a132
 
d3a132
-    xmlrpc_mem_block_clean(&elemP->children);
d3a132
+    XMLRPC_MEMBLOCK_FREE(xml_element *, elemP->childrenP);
d3a132
 
d3a132
     free(elemP);
d3a132
 }
d3a132
 
d3a132
 
d3a132
-
d3a132
 /*=========================================================================
d3a132
 **  Miscellaneous Accessors
d3a132
 **=========================================================================
d3a132
@@ -185,36 +187,47 @@ xml_element_free(xml_element * const elemP) {
d3a132
 **  documentation on each function works.
d3a132
 */
d3a132
 
d3a132
+
d3a132
+
d3a132
 const char *
d3a132
 xml_element_name(const xml_element * const elemP) {
d3a132
 
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
+
d3a132
     return elemP->name;
d3a132
 }
d3a132
 
d3a132
+
d3a132
+
d3a132
 size_t
d3a132
-xml_element_cdata_size(const xml_element * const elemP) {
d3a132
-    /* The result of this function is NOT VALID until the end_element handler
d3a132
-       has been called!
d3a132
-    */
d3a132
+xml_element_cdata_size (const xml_element * const elemP) {
d3a132
+/*----------------------------------------------------------------------------
d3a132
+  The result of this function is NOT VALID until the end_element handler
d3a132
+  has been called!
d3a132
+-----------------------------------------------------------------------------*/
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
-    return XMLRPC_TYPED_MEM_BLOCK_SIZE(char, &elemP->cdata) - 1;
d3a132
+
d3a132
+    return XMLRPC_MEMBLOCK_SIZE(char, elemP->cdataP) - 1;
d3a132
 }
d3a132
 
d3a132
 
d3a132
 
d3a132
 const char *
d3a132
 xml_element_cdata(const xml_element * const elemP) {
d3a132
+
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
-    return XMLRPC_TYPED_MEM_BLOCK_CONTENTS(char, &elemP->cdata);
d3a132
+
d3a132
+    return XMLRPC_TYPED_MEM_BLOCK_CONTENTS(const char, elemP->cdataP);
d3a132
 }
d3a132
 
d3a132
 
d3a132
 
d3a132
 unsigned int
d3a132
 xml_element_children_size(const xml_element * const elemP) {
d3a132
+
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
-    return XMLRPC_TYPED_MEM_BLOCK_SIZE(xml_element *, &elemP->children);
d3a132
+
d3a132
+    return XMLRPC_MEMBLOCK_SIZE(xml_element *, elemP->childrenP);
d3a132
 }
d3a132
 
d3a132
 
d3a132
@@ -222,47 +235,42 @@ xml_element_children_size(const xml_element * const elemP) {
d3a132
 xml_element **
d3a132
 xml_element_children(const xml_element * const elemP) {
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
-    return XMLRPC_TYPED_MEM_BLOCK_CONTENTS(xml_element *, &elemP->children);
d3a132
+    return XMLRPC_MEMBLOCK_CONTENTS(xml_element *, elemP->childrenP);
d3a132
 }
d3a132
 
d3a132
 
d3a132
 
d3a132
-/*=========================================================================
d3a132
-**  Internal xml_element Utility Functions
d3a132
-**=========================================================================
d3a132
-*/
d3a132
+/*=============================================================================
d3a132
+  Internal xml_element Utility Functions
d3a132
+=============================================================================*/
d3a132
 
d3a132
 static void
d3a132
-xmlElementAppendCdata(xmlrpc_env *  const envP,
d3a132
-				      xml_element * const elemP,
d3a132
-				      const char *  const cdata,
d3a132
-				      size_t        const size) {
d3a132
+xml_element_append_cdata(xmlrpc_env *  const envP,
d3a132
+                         xml_element * const elemP,
d3a132
+                         const char *  const cdata,
d3a132
+                         size_t        const size) {
d3a132
 
d3a132
     XMLRPC_ASSERT_ENV_OK(envP);
d3a132
-    XMLRPC_ASSERT_ELEM_OK(elemP);    
d3a132
+    XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
 
d3a132
-    XMLRPC_TYPED_MEM_BLOCK_APPEND(char, envP, &elemP->cdata, cdata, size);
d3a132
+    XMLRPC_MEMBLOCK_APPEND(char, envP, elemP->cdataP, cdata, size);
d3a132
 }
d3a132
 
d3a132
 
d3a132
 
d3a132
 static void
d3a132
-xmlElementAppendChild(xmlrpc_env *  const envP,
d3a132
-				      xml_element * const elemP,
d3a132
-				      xml_element * const childP) {
d3a132
-
d3a132
-    /* Whether or not this function succeeds, it takes ownership of the 'child'
d3a132
-       argument.
d3a132
-       WARNING - This is the exact opposite of the usual memory ownership
d3a132
-       rules for xmlrpc_value! So please pay attention.
d3a132
-    */
d3a132
+xml_element_append_child(xmlrpc_env *  const envP,
d3a132
+                         xml_element * const elemP,
d3a132
+                         xml_element * const childP) {
d3a132
+/*----------------------------------------------------------------------------
d3a132
+  Whether or not this function succeeds, it takes ownership of *childP.
d3a132
+-----------------------------------------------------------------------------*/
d3a132
     XMLRPC_ASSERT_ENV_OK(envP);
d3a132
     XMLRPC_ASSERT_ELEM_OK(elemP);
d3a132
     XMLRPC_ASSERT_ELEM_OK(childP);
d3a132
-    assert(childP->parentP == NULL);
d3a132
+    XMLRPC_ASSERT(childP->parentP == NULL);
d3a132
 
d3a132
-    XMLRPC_TYPED_MEM_BLOCK_APPEND(xml_element *, envP, &elemP->children,
d3a132
-                                  &childP, 1);
d3a132
+    XMLRPC_MEMBLOCK_APPEND(xml_element *, envP, elemP->childrenP, &childP, 1);
d3a132
     if (!envP->fault_occurred)
d3a132
         childP->parentP = elemP;
d3a132
     else
d3a132
@@ -317,7 +325,7 @@ startElement_(void *           const userData,
d3a132
             /* (We need to watch our error handling invariants very carefully
d3a132
             ** here. Read the docs for xml_elementAppendChild. */
d3a132
             newCurrentP = elemP;
d3a132
-            xmlElementAppendChild(&contextP->env, contextP->currentP, elemP);
d3a132
+            xml_element_append_child(&contextP->env, contextP->currentP, elemP);
d3a132
             elemP = NULL;
d3a132
             XMLRPC_FAIL_IF_FAULT(&contextP->env);
d3a132
             contextP->currentP = newCurrentP;
d3a132
@@ -348,7 +356,7 @@ endElement_(void *          const userData,
d3a132
                contextP->currentP == contextP->rootP);
d3a132
 
d3a132
         /* Add a trailing '\0' to our cdata. */
d3a132
-        xmlElementAppendCdata(&contextP->env, contextP->currentP, "\0", 1);
d3a132
+        xml_element_append_cdata(&contextP->env, contextP->currentP, "\0", 1);
d3a132
         if (!contextP->env.fault_occurred) {
d3a132
             /* Pop our "stack" of elements. */
d3a132
             contextP->currentP = contextP->currentP->parentP;
d3a132
@@ -370,9 +378,9 @@ characterData(void *          const userData,
d3a132
     /* Get our context and see if an error has already occured. */
d3a132
     contextP = (ParseContext*)userData;
d3a132
     if (!contextP->env.fault_occurred) {
d3a132
-        assert(contextP->currentP != NULL);
d3a132
+        XMLRPC_ASSERT(contextP->currentP != NULL);
d3a132
 	
d3a132
-        xmlElementAppendCdata(&contextP->env,
d3a132
+        xml_element_append_cdata(&contextP->env,
d3a132
                               contextP->currentP,
d3a132
                               (char *)s,
d3a132
                               len);
d3a132
@@ -428,7 +436,7 @@ static xmlSAXHandler const saxHandler = {
d3a132
 
d3a132
 
d3a132
 static void
d3a132
-removeDocSizeLimit(xmlParserCtx * const parserP ATTR_UNUSED) {
d3a132
+removeDocSizeLimit(xmlParserCtxt * const parserP ATTR_UNUSED) {
d3a132
 /*----------------------------------------------------------------------------
d3a132
    Set up *parserP to accept a document of any size.
d3a132
 
d3a132
@@ -451,13 +459,13 @@ removeDocSizeLimit(xmlParserCtx * const parserP ATTR_UNUSED) {
d3a132
 
d3a132
 
d3a132
 static void
d3a132
-createParser(xmlrpc_env *    const envP,
d3a132
-             ParseContext *  const contextP,
d3a132
-             xmlParserCtx ** const parserPP) {
d3a132
+createParser(xmlrpc_env *     const envP,
d3a132
+             ParseContext *   const contextP,
d3a132
+             xmlParserCtxt ** const parserPP) {
d3a132
 /*----------------------------------------------------------------------------
d3a132
    Create an appropriate Libxml2 parser for our purpose.
d3a132
 -----------------------------------------------------------------------------*/
d3a132
-    xmlParserCtx * parserP;
d3a132
+    xmlParserCtxt * parserP;
d3a132
 
d3a132
     parserP = xmlCreatePushParserCtxt((xmlSAXHandler *)&saxHandler, contextP,
d3a132
                                         NULL, 0, NULL);
d3a132
-- 
d3a132
2.11.0
d3a132