[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [xml] xmlNodeDump looses data
- From: Daniel Veillard <veillard redhat com>
- To: Petr Pajas <pajas ufal ms mff cuni cz>
- Cc: libxml2 <xml gnome org>
- Subject: Re: [xml] xmlNodeDump looses data
- Date: Sat, 16 Feb 2008 13:25:53 -0500
On Fri, Feb 15, 2008 at 04:59:36PM +0100, Petr Pajas wrote:
> Hi Daniel, All,
>
> one of the users of the Perl bindings reported a strange bug which I
> was able to reduce to the attached very very simple "test.c"
> program and a XML file "test2.xml".
>
> The program parses the XML file into a tree, and then dumps the root
> element using xmlNodeDump.
>
> In the result, a complete text content of a text node within an
> element <linkage> is missing.
[...]
Bill started to dig the problem earlier today and we came up
with a patch (commited to SVN in revision 3695)
This is a bad combination of buffer limits and saving to a string
when using predefined entities in text. Patch is rather simple actually.
> The bug seems to me rather serious since it can have really bad
> consequences for applications that use xmlNodeDump.
Well apparently that function has been around at least since 2004 since
Bill already fixed a bug there a in Nov 2004. Surprizingly the bug seems
to have gonne unnoticed for years, apparently it's not that easy to trigger
but i will soon push a new release, maybe next week.
> Please let me know if you need more information.
Nahh that was just fine, patch enclosed, thanks a lot,
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard redhat com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
Index: xmlIO.c
===================================================================
--- xmlIO.c (revision 3694)
+++ xmlIO.c (working copy)
@@ -3315,6 +3315,16 @@
cons = len;
chunk = (out->buffer->size - out->buffer->use) - 1;
+ /*
+ * make sure we have enough room to save first, if this is
+ * not the case force a flush, but make sure we stay in the loop
+ */
+ if (chunk < 40) {
+ nbchars = 0;
+ oldwritten = -1;
+ goto flush;
+ }
+
/*
* first handle encoding stuff.
*/
@@ -3360,6 +3370,7 @@
if ((nbchars < MINLEN) && (len <= 0))
goto done;
+flush:
if (out->writecallback) {
/*
* second write the stuff to the I/O channel
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]