Roumen Petrov | 20 May 17:26
Favicon

use mingw C99 compatible functions {v}snprintf instead those from MSVC runtime

Hi All,

Please could you review and test enhancement from attachment 
"0001-use-mingw-C99-compatible-functions-v-snprintf-instea.patch".
It is registered as request 
https://bugzilla.gnome.org/show_bug.cgi?id=676427 .

Since version 3.15 mingw runtime implement C99 compatible *printf 
functions in particular {v}snprintf.
The difference is visible in libxslt regression test if environment 
variable PRINTF_EXPONENT_DIGITS is set to 2 - regression tests pass.

Regards,
Roumen
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml <at> gnome.org
http://mail.gnome.org/mailman/listinfo/xml
Roumen Petrov | 20 May 09:55
Favicon

cleanup on randomization - inconsistent in master

Hi All,

One of recent updates swicth from rand to rand_r but it seems to me 
switch is incomplete:
- dict.c - #ifdef HAVE_RAND_R
- libxml.h -   +#if defined(HAVE_RAND)
- configure check for rand function but not for rand_r

Please to update configure script and libxml.h header to be consistent.

Post 2.8.0 could implement fail back solution to rand as not all 
platforms provide rand_r.

Roumen
Earnie Boyd | 18 May 17:01
Picon

Re: Release candidate 1 of libxml2 2.8.0

On Fri, May 18, 2012 at 8:34 AM, Jon <jon.forums <at> gmail.com> wrote:
>>   I finally managed to go though all the patches which accumulated in
>> Gnome bugzilla and do the various necessary cleanups to try to get a
>> release. There is however *many* changes, especially on the portability
>> side which I just can't test myself (including many changes on various
>> Windows toolchains). So I just made a release candidate of 2.8.0
>>
>>    ftp://xmlsoft.org/libxml2/
>
>
> Win7 32bit using a msys/mingw-w64 toolchain with gcc 4.7.1.
>
> sh -c "./configure --prefix=$PWD/build --with-zlib=C:/devlibs/zlib-1.2.7 --without-iconv --without-docbook"
>

Whose GCC build are you using?

For mingw.org, I had to --without-threads.  I don't have python
enabled so also --without-python.

I received no regression errors.

I'll try to enable python to see where I get with it.

--

-- 
Earnie
-- https://sites.google.com/site/earnieboyd
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml <at> gnome.org
(Continue reading)

Daniel Veillard | 18 May 15:48
Picon
Favicon
Gravatar

Re: Release candidate 1 of libxml2 2.8.0

On Fri, May 18, 2012 at 08:34:03AM -0400, Jon wrote:
> >   I finally managed to go though all the patches which accumulated in
> > Gnome bugzilla and do the various necessary cleanups to try to get a
> > release. There is however *many* changes, especially on the portability
> > side which I just can't test myself (including many changes on various
> > Windows toolchains). So I just made a release candidate of 2.8.0
> > 
> >    ftp://xmlsoft.org/libxml2/
> 
> 
> Win7 32bit using a msys/mingw-w64 toolchain with gcc 4.7.1.
> 
> sh -c "./configure --prefix=$PWD/build --with-zlib=C:/devlibs/zlib-1.2.7 --without-iconv --without-docbook"
> 
> testapi.exe
> ...
> Testing xpath : 30 of 38 functions ...
> Testing xpathInternals : 106 of 117 functions ...
> Testing xpointer : 17 of 21 functions ...
> Total: 1160 functions, 291374 tests, 0 errors

  Cool, another one, thanks !

Daniel

--

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel <at> veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/
(Continue reading)

Michael Ludwig | 16 May 16:51
Picon
Picon

Re: Release candidate 1 of libxml2 2.8.0

Liam R E Quin schrieb am 16.05.2012 um 11:32 (+0200):
> On Wed, 2012-05-16 at 00:16 +0200, Michael Ludwig wrote:
> 
> > ./testapi.exe
> > 
> > This tests gets firewalled by the W3.ORG servers, I checked using
> > netstat. So I interrupted it. The source file testapi.c is huge.
> > Is there an easy way to instruct the program not to go the W3.ORG
> > servers like with xmllint --nonet?
> 
> Use an XML Catalogue file to point to a local copy of the HTML DTDs (if
> that's what is being fetched), and there's an environment variable you
> can set to point to it, confusingly named SGML_CATALOG_FILE I think.

$ export XML_CATALOG_FILES=/usr/local/src/libxml2/katalog.xml
$ cat $XML_CATALOG_FILES

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

 <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  uri="dtd/xhtml1/xhtml1-strict.dtd"/>

 <system systemId="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  uri="dtd/xhtml1/xhtml1-transitional.dtd"/>

 <system systemId="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
  uri="dtd/xhtml11/xhtml11-flat.dtd"/>

</catalog>

(Continue reading)

Shultz Tal | 15 May 18:44
Favicon

RedHat 6

Hi,

 

We moved our product to Linux RH6 instead of RH5,

And need to know which libxml2 version supports RH6 (we run in 32 bit mode)

 

Thanks,

Tal


“This e-mail message may contain confidential, commercial or privileged information that constitutes proprietary information of Comverse Technology or its subsidiaries. If you are not the intended recipient of this message, you are hereby notified that any review, use or distribution of this information is absolutely prohibited and we request that you delete all copies and contact us by e-mailing to: security <at> comverse.com. Thank You.”
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml <at> gnome.org
http://mail.gnome.org/mailman/listinfo/xml
Daniel Veillard | 15 May 14:48
Picon
Favicon
Gravatar

Release candidate 1 of libxml2 2.8.0

  I finally managed to go though all the patches which accumulated in
Gnome bugzilla and do the various necessary cleanups to try to get a
release. There is however *many* changes, especially on the portability
side which I just can't test myself (including many changes on various
Windows toolchains). So I just made a release candidate of 2.8.0

   ftp://xmlsoft.org/libxml2/

look for libxml2-2.8.0-rc1.tar.gz, there is also rpms generated on my
Fedora 16 box for those interested.
The code seems to work okay, I have been running with the changes as
I added them and my system didn't blew up, it passes valgrind, there
doesn't seems to be leaks at least on the main paths, so I think it's
time for more general testing.
 Please give it a try, I will make other rc release if needed, and
will try to shoot for a final 2.8.0 release a week from now ! I know a
number of people waited for an official release, please help me finish
by testing it and report problems if you find some :-)

  thanks in advance,

Daniel

--

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel <at> veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/
David Hallberg | 11 May 20:55
Picon

package libxml2-2.7.8-r7: task do_configure: Failed

Hi, 
While trying to build "MACHINE=beaglebone bitbake qcanobserver"
I had this failure:

package libxml2-2.7.8-r7: task do_configure: Failed

ERROR: libxml2: md5 data is not matching for file://Copyright;md5=bb90c48926316d9af6e2d70ca7013ade
ERROR: libxml2: The new md5 checksum is d41d8cd98f00b204e9800998ecf8427e
ERROR: libxml2: Check if the license information has changed in
ERROR: Licensing Error: LIC_FILES_CHKSUM does not match, please fix

Please advise if this is the proper place to report this problem.

Thanks,
David Hallberg


_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml <at> gnome.org
http://mail.gnome.org/mailman/listinfo/xml
Conrad Irwin | 11 May 05:17
Picon
Gravatar

[PATCH] Use buffers when constructing string node lists.

Hi Veillard and all,

Firstly, thanks for libxml: it's awesome!

I noticed recently that libxml was taking a surprisingly long time to perform some
operations (many minutes instead of milliseconds), and so I did some digging. It turns out
that the problem was caused by the realloc()ing done in xmlNodeAddContentLen() which can
be called many (many) times when assigning some content into a node.

For background, I'm dealing with XML that contains emails, these can have large
attachments (~6MB) which are base-64 encoded, line-wrapped at 78 chars, and each line ends
with &#13;. This means that xmlNodeAddContentLen() is being called about 200,000 times,
and so there are 200,000 reallocs of a 6MB string, which takes a while... (I put a synthetic
example of this at https://gist.github.com/2656940)

The attached patch works around that problem by using the existing buffer API to merge the
strings together before even creating the text node, this keeps the number of realloc()s
at a managable level.

I'd love feedback on the patch, and am happy to fix problems with it, or explore other
solutions if you think that this is barking up the wrong tree :).

Thanks,

Conrad

P.S. Should I create a bug for this too?

------8<------

Before this change xmlStringGetNodeList would perform a realloc() of the
entire new content for every XML entity in the assigned text in order to
merge together adjacent text nodes. This had the effect of making
xmlSetNodeContent O(n^2), which led to unexpectedly bad performance on
inputs that contained a large number of XML entities.

After this change the memory management is done by the buffer API,
avoiding the need to continually re-measure and realloc() the string.

For my test data (6MB of 80 character lines, each ending with &#13;)
this takes the time to xmlSetNodeContent from about 500 seconds to
around 50ms. I have not profiled smaller cases, though I tried to
minimize the performance impact of my change by avoiding unnecessary
string copying.

Signed-off-by: Conrad Irwin <conrad.irwin <at> gmail.com>
---
 include/libxml/tree.h |    2 +
 tree.c                |  196 +++++++++++++++++++++++++++++--------------------
 2 files changed, 117 insertions(+), 81 deletions(-)

diff --git a/include/libxml/tree.h b/include/libxml/tree.h
index b733589..b522f61 100644
--- a/include/libxml/tree.h
+++ b/include/libxml/tree.h
@@ -694,6 +694,8 @@ XMLPUBFUN void XMLCALL
 		xmlBufferEmpty		(xmlBufferPtr buf);
 XMLPUBFUN const xmlChar* XMLCALL	
 		xmlBufferContent	(const xmlBufferPtr buf);
+XMLPUBFUN xmlChar* XMLCALL
+		xmlBufferDetach         (const xmlBufferPtr buf);
 XMLPUBFUN void XMLCALL		
 		xmlBufferSetAllocationScheme(xmlBufferPtr buf,
 					 xmlBufferAllocationScheme scheme);
diff --git a/tree.c b/tree.c
index a2fdcbf..a71b776 100644
--- a/tree.c
+++ b/tree.c
@@ -1261,9 +1261,13 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
     const xmlChar *cur = value, *end = cur + len;
     const xmlChar *q;
     xmlEntityPtr ent;
+    xmlBufferPtr buffer;

     if (value == NULL) return(NULL);

+    buffer = xmlBufferCreateSize(0);
+    if (buffer == NULL) return(NULL);
+
     q = cur;
     while ((cur < end) && (*cur != 0)) {
 	if (cur[0] == '&') {
@@ -1274,19 +1278,8 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
 	     * Save the current text.
 	     */
             if (cur != q) {
-		if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
-		    xmlNodeAddContentLen(last, q, cur - q);
-		} else {
-		    node = xmlNewDocTextLen(doc, q, cur - q);
-		    if (node == NULL) return(ret);
-		    if (last == NULL)
-			last = ret = node;
-		    else {
-			last->next = node;
-			node->prev = last;
-			last = node;
-		    }
-		}
+		if (xmlBufferAdd(buffer, q, cur - q))
+		    goto out;
 	    }
 	    q = cur;
 	    if ((cur + 2 < end) && (cur[1] == '#') && (cur[2] == 'x')) {
@@ -1351,7 +1344,7 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
 		if ((cur >= end) || (*cur == 0)) {
 		    xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY, (xmlNodePtr) doc,
 		               (const char *) q);
-		    return(ret);
+		    goto out;
 		}
 		if (cur != q) {
 		    /*
@@ -1361,23 +1354,36 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {
 		    ent = xmlGetDocEntity(doc, val);
 		    if ((ent != NULL) &&
 			(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
-			if (last == NULL) {
-			    node = xmlNewDocText(doc, ent->content);
-			    last = ret = node;
-			} else if (last->type != XML_TEXT_NODE) {
-			    node = xmlNewDocText(doc, ent->content);
-			    last = xmlAddNextSibling(last, node);
-			} else
-			    xmlNodeAddContent(last, ent->content);
+
+			if (xmlBufferCat(buffer, ent->content))
+			    goto out;

 		    } else {
 			/*
+			 * Flush buffer so far
+			 */
+			if (buffer->use) {
+			    node = xmlNewDocText(doc, NULL);
+			    if (node == NULL) {
+				if (val != NULL) xmlFree(val);
+				goto out;
+			    }
+			    node->content = xmlBufferDetach(buffer);
+
+			    if (last == NULL) {
+				last = ret = node;
+			    } else {
+				last = xmlAddNextSibling(last, node);
+			    }
+			}
+
+			/*
 			 * Create a new REFERENCE_REF node
 			 */
 			node = xmlNewReference(doc, val);
 			if (node == NULL) {
 			    if (val != NULL) xmlFree(val);
-			    return(ret);
+			    goto out;
 			}
 			else if ((ent != NULL) && (ent->children == NULL)) {
 			    xmlNodePtr temp;
@@ -1409,35 +1415,39 @@ xmlStringLenGetNodeList(xmlDocPtr doc, const xmlChar *value, int len) {

 		l = xmlCopyCharMultiByte(buf, charval);
 		buf[l] = 0;
-		node = xmlNewDocText(doc, buf);
-		if (node != NULL) {
-		    if (last == NULL) {
-			last = ret = node;
-		    } else {
-			last = xmlAddNextSibling(last, node);
-		    }
-		}
+
+		if (xmlBufferCat(buffer, buf))
+		    goto out;
 		charval = 0;
 	    }
 	} else
 	    cur++;
     }
-    if ((cur != q) || (ret == NULL)) {
+
+    if (cur != q) {
         /*
 	 * Handle the last piece of text.
 	 */
-	if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
-	    xmlNodeAddContentLen(last, q, cur - q);
+	if (xmlBufferAdd(buffer, q, cur - q))
+	    goto out;
+    }
+
+    if (buffer->use) {
+	node = xmlNewDocText(doc, NULL);
+	if (node == NULL) goto out;
+	node->content = xmlBufferDetach(buffer);
+
+	if (last == NULL) {
+	    last = ret = node;
 	} else {
-	    node = xmlNewDocTextLen(doc, q, cur - q);
-	    if (node == NULL) return(ret);
-	    if (last == NULL) {
-		ret = node;
-	    } else {
-		xmlAddNextSibling(last, node);
-	    }
+	    last = xmlAddNextSibling(last, node);
 	}
+    } else if (ret == NULL) {
+        ret = xmlNewDocText(doc, BAD_CAST "");
     }
+
+out:
+    xmlBufferFree(buffer);
     return(ret);
 }

@@ -1458,9 +1468,13 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
     const xmlChar *cur = value;
     const xmlChar *q;
     xmlEntityPtr ent;
+    xmlBufferPtr buffer;

     if (value == NULL) return(NULL);

+    buffer = xmlBufferCreateSize(0);
+    if (buffer == NULL) return(NULL);
+
     q = cur;
     while (*cur != 0) {
 	if (cur[0] == '&') {
@@ -1471,19 +1485,8 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
 	     * Save the current text.
 	     */
             if (cur != q) {
-		if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
-		    xmlNodeAddContentLen(last, q, cur - q);
-		} else {
-		    node = xmlNewDocTextLen(doc, q, cur - q);
-		    if (node == NULL) return(ret);
-		    if (last == NULL)
-			last = ret = node;
-		    else {
-			last->next = node;
-			node->prev = last;
-			last = node;
-		    }
-		}
+		if (xmlBufferAdd(buffer, q, cur - q))
+		    goto out;
 	    }
 	    q = cur;
 	    if ((cur[1] == '#') && (cur[2] == 'x')) {
@@ -1536,7 +1539,7 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
 		if (*cur == 0) {
 		    xmlTreeErr(XML_TREE_UNTERMINATED_ENTITY,
 		               (xmlNodePtr) doc, (const char *) q);
-		    return(ret);
+		    goto out;
 		}
 		if (cur != q) {
 		    /*
@@ -1546,23 +1549,32 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
 		    ent = xmlGetDocEntity(doc, val);
 		    if ((ent != NULL) &&
 			(ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)) {
-			if (last == NULL) {
-			    node = xmlNewDocText(doc, ent->content);
-			    last = ret = node;
-			} else if (last->type != XML_TEXT_NODE) {
-			    node = xmlNewDocText(doc, ent->content);
-			    last = xmlAddNextSibling(last, node);
-			} else
-			    xmlNodeAddContent(last, ent->content);
+
+			if (xmlBufferCat(buffer, ent->content))
+			    goto out;

 		    } else {
 			/*
+			 * Flush buffer so far
+			 */
+			if (buffer->use) {
+			    node = xmlNewDocText(doc, NULL);
+			    node->content = xmlBufferDetach(buffer);
+
+			    if (last == NULL) {
+				last = ret = node;
+			    } else {
+				last = xmlAddNextSibling(last, node);
+			    }
+			}
+
+			/*
 			 * Create a new REFERENCE_REF node
 			 */
 			node = xmlNewReference(doc, val);
 			if (node == NULL) {
 			    if (val != NULL) xmlFree(val);
-			    return(ret);
+			    goto out;
 			}
 			else if ((ent != NULL) && (ent->children == NULL)) {
 			    xmlNodePtr temp;
@@ -1593,14 +1605,10 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {

 		len = xmlCopyCharMultiByte(buf, charval);
 		buf[len] = 0;
-		node = xmlNewDocText(doc, buf);
-		if (node != NULL) {
-		    if (last == NULL) {
-			last = ret = node;
-		    } else {
-			last = xmlAddNextSibling(last, node);
-		    }
-		}
+
+		if (xmlBufferCat(buffer, buf))
+		    goto out;
+		charval = 0;
 	    }
 	} else
 	    cur++;
@@ -1609,18 +1617,22 @@ xmlStringGetNodeList(xmlDocPtr doc, const xmlChar *value) {
         /*
 	 * Handle the last piece of text.
 	 */
-	if ((last != NULL) && (last->type == XML_TEXT_NODE)) {
-	    xmlNodeAddContentLen(last, q, cur - q);
+	xmlBufferAdd(buffer, q, cur - q);
+    }
+
+    if (buffer->use) {
+	node = xmlNewDocText(doc, NULL);
+	node->content = xmlBufferDetach(buffer);
+
+	if (last == NULL) {
+	    last = ret = node;
 	} else {
-	    node = xmlNewDocTextLen(doc, q, cur - q);
-	    if (node == NULL) return(ret);
-	    if (last == NULL) {
-		last = ret = node;
-	    } else {
-		last = xmlAddNextSibling(last, node);
-	    }
+	    last = xmlAddNextSibling(last, node);
 	}
     }
+
+out:
+    xmlBufferFree(buffer);
     return(ret);
 }

@@ -6916,6 +6928,28 @@ xmlBufferCreateSize(size_t size) {
 }

 /**
+ * xmlBufferDetach
+ * @buf:  the buffer
+ *
+ * Returns the previous string contained by the buffer.
+ *
+ */
+xmlChar *
+xmlBufferDetach(xmlBufferPtr buf) {
+    xmlChar *ret;
+
+    if (buf == NULL) return(NULL);
+
+    ret = buf->content;
+    buf->content = NULL;
+    buf->size = 0;
+    buf->use = 0;
+
+    return ret;
+}
+
+
+/**
  * xmlBufferCreateStatic:
  * @mem: the memory area
  * @size:  the size in byte
--

-- 
1.7.10.207.g0bb2e
Johan Corveleyn | 9 May 14:12
Picon

Re: xmllint reports non-determinist content model for schema

With the upcoming release in mind, a quick plug for the issue in this
mail-thread (see below for a quick summary). Would anyone be able to
look into this issue, and come up with a fix?

I'm really not familiar with the codebase myself, and with how XML
schema validation works in general, so I'm afraid I can't come up with
a patch myself. All I can do is report the issue as clearly as
possible, and ask :-).

See https://bugzilla.gnome.org/show_bug.cgi?id=670865 in Bugzilla.

Quick summary of the email conversation:

On Fri, Feb 24, 2012 at 2:14 PM, Johan Corveleyn <jcorvel <at> gmail.com> wrote:
...
> I'm running into a "non-determinist" error with a schema even though I
> don't think it's non-determinist (and both XSV and Xerces agree with
> me; they too have no problem with the schema). I have reduced my
> test-case to a simple example, see below.

On Fri, Feb 24, 2012 at 2:58 PM, Pete Cordell <petexmldev <at> codalogic.com> wrote:
>> FWIW, the schema looks OK to me and neither Visual Studio or the W3C's XSV
>> seem to report an error, so it does look like a libxml2 bug.

On Tue, Feb 28, 2012 at 6:00 AM, Daniel Veillard <veillard <at> redhat.com> wrote:
...
>  Well in that case it seems the underlying code is generating a
> wrong automata so it should be a matter of running that minimal
> test case under gdb with the breakpoint appropriately set to find out
> what wrong transition got added ...
>
>  BTW thanks for making a minimalist case it is clearly a bug !

Thanks,
--

-- 
Johan
Diki Dera | 9 May 12:26
Picon

If LibXML2 is compiled with pthreads support on Windows it causes a crash.

I am using MinGW with GCC 4.5.2 on Windows 7 x64 compiling 32-bit
programs. I have compiled libxml2 from source. I had used the
configure.js script in the win32 folder, I was able to produce a
static version only.
Ever since, I used that one, but my binary size was over a megabyte
big(otherwise it worked perfectly), because of the static version of
libxml2. So since with configure.js I had no option to make a shared
library of libxml2 I resorted to using the standard ./configure script
which is in the main path.

Everything went smoothly, I produced a static AND shared version, but
thread support was auto set to pthreads. I linked to libxml2.dll.a, as
soon as I ran the program I immediately got a crash in
libpthread-2.dll. Same thing with the static version produced by
standard ./configure. Using GDB I was able to track the problem to
threads.c around line 658
which is this code

xmlGlobalStatePtr
xmlGetGlobalState(void)
{
#ifdef HAVE_PTHREAD_H
    xmlGlobalState *globalval;

    if (libxml_is_threaded == 0)
        return (NULL);

    pthread_once(&once_control, xmlOnceInit);

    if ((globalval = (xmlGlobalState *)
         pthread_getspecific(globalkey)) == NULL) {
        xmlGlobalState *tsd = xmlNewGlobalState();
	if (tsd == NULL)
	    return(NULL);

        pthread_setspecific(globalkey, tsd);
        return (tsd);
    }
    return (globalval);

More specifically,  pthread_setspecific(globalkey, tsd); is where the
crash occurs. Using the one compiled with configure.js in the win32
folder(and makefile.mingw) I see the option to use threads was set to
native, I have no problem with that library but there is only a static
library available. However if I specify threads=pthreads in
configure.js and produce a library, it also causes a crash. Anything
related to pthreads IN libxml2 causes a crash. But my application also
uses pthreads to spawn threads.

Any possible fix for this?

Gmane