[libxml2] Fix buffering in xmlOutputBufferWrite



commit dea91c97debeac7c1aaf9c19f79029809e23a353
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Tue Jul 27 16:12:54 2021 +0200

    Fix buffering in xmlOutputBufferWrite
    
    Fix a regression introduced with commit a697ed1e which caused
    xmlOutputBufferWrite to flush internal buffers too late.
    
    Fixes #296.

 xmlIO.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
---
diff --git a/xmlIO.c b/xmlIO.c
index 57312b97..f20c0fa0 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -3401,12 +3401,18 @@ xmlOutputBufferWrite(xmlOutputBufferPtr out, int len, const char *buf) {
                out->error = XML_IO_ENCODER;
                return(-1);
            }
-            nbchars = ret >= 0 ? ret : 0;
+            if (out->writecallback)
+               nbchars = xmlBufUse(out->conv);
+            else
+                nbchars = ret >= 0 ? ret : 0;
        } else {
            ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk);
            if (ret != 0)
                return(-1);
-            nbchars = chunk;
+            if (out->writecallback)
+               nbchars = xmlBufUse(out->buffer);
+            else
+                nbchars = chunk;
        }
        buf += chunk;
        len -= chunk;
@@ -3593,13 +3599,19 @@ xmlOutputBufferWriteEscape(xmlOutputBufferPtr out, const xmlChar *str,
                out->error = XML_IO_ENCODER;
                return(-1);
            }
-            nbchars = ret >= 0 ? ret : 0;
+            if (out->writecallback)
+               nbchars = xmlBufUse(out->conv);
+            else
+                nbchars = ret >= 0 ? ret : 0;
        } else {
            ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons);
            if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
                return(-1);
             xmlBufAddLen(out->buffer, chunk);
-            nbchars = chunk;
+            if (out->writecallback)
+               nbchars = xmlBufUse(out->buffer);
+            else
+                nbchars = chunk;
        }
        str += cons;
        len -= cons;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]