This is an automated email from the ASF dual-hosted git repository.

scantor pushed a commit to branch xerces-3.3
in repository https://gitbox.apache.org/repos/asf/xerces-c.git


The following commit(s) were added to refs/heads/xerces-3.3 by this push:
     new 8200b89ce XERCESC-2250 - Curl NetAccessor mishandles larger data with 
error
8200b89ce is described below

commit 8200b89ce4a6fee805af099844fdd84a1867c507
Author: Scott Cantor <canto...@osu.edu>
AuthorDate: Mon Sep 23 15:11:14 2024 -0400

    XERCESC-2250 - Curl NetAccessor mishandles larger data with error
    
    https://issues.apache.org/jira/browse/XERCESC-2250
---
 .../util/NetAccessors/Curl/CurlURLInputStream.cpp  | 42 +++++++++++++++++-----
 .../util/NetAccessors/Curl/CurlURLInputStream.hpp  |  3 +-
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp 
b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
index 17ddf0261..b05ae5e40 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
@@ -64,8 +64,10 @@ CurlURLInputStream::CurlURLInputStream(const XMLURL& 
urlSource, const XMLNetHTTP
       , fBytesRead(0)
       , fBytesToRead(0)
       , fDataAvailable(false)
-      , fBufferHeadPtr(fBuffer)
-      , fBufferTailPtr(fBuffer)
+      , fBuffer(0)
+      , fBufferHeadPtr(0)
+      , fBufferTailPtr(0)
+      , fBufferSize(0)
       , fPayload(0)
       , fPayloadLen(0)
       , fContentType(0)
@@ -212,6 +214,12 @@ void CurlURLInputStream::cleanup()
 
     if(fHeadersList) curl_slist_free_all(fHeadersList);
     fHeadersList = NULL;
+
+    if(fBuffer) fMemoryManager->deallocate(fBuffer);
+    fBuffer = NULL;
+    fBufferHeadPtr = NULL;
+    fBufferTailPtr = NULL;
+    fBufferSize = 0;
 }
 
 
@@ -257,13 +265,29 @@ CurlURLInputStream::writeCallback(char *buffer,
        cnt                             -= consume;
        if (cnt > 0)
        {
-               XMLSize_t bufAvail = sizeof(fBuffer) - (fBufferHeadPtr - 
fBuffer);
-               consume = (cnt > bufAvail) ? bufAvail : cnt;
-               memcpy(fBufferHeadPtr, buffer, consume);
-               fBufferHeadPtr  += consume;
-               buffer                  += consume;
-               totalConsumed   += consume;
-               //printf("write callback rebuffering %d bytes\n", consume);
+                XMLSize_t bufAvail = fBufferSize - (fBufferHeadPtr - fBuffer);
+                if (bufAvail < cnt) {
+                    // Enlarge the buffer.
+                    XMLByte* newbuf = 
reinterpret_cast<XMLByte*>(fMemoryManager->allocate(fBufferSize + (cnt - 
bufAvail)));
+                    if (!newbuf) {
+                        // Enlarge attempt failed, signal error back to 
libcurl.
+                        // The dedicated error code is a recent libcurl 
addition so is not portable.
+                        return 0;
+                    }
+                    // Not a realloc, so we have to copy the data from old to 
new.
+                    memcpy(newbuf, fBuffer, fBufferHeadPtr - fBuffer);
+                    fBufferSize = fBufferSize + (cnt - bufAvail);
+                    //printf("enlarged buffer to %u bytes", fBufferSize);
+                    fBufferHeadPtr = newbuf + (fBufferHeadPtr - fBuffer);
+                    fMemoryManager->deallocate(fBuffer);
+                    fBuffer = fBufferTailPtr = newbuf;
+                }
+
+                memcpy(fBufferHeadPtr, buffer, cnt);
+                fBufferHeadPtr  += cnt;
+                buffer += cnt;
+                totalConsumed   += cnt;
+                //printf("write callback rebuffering %u bytes", cnt);
        }
 
        // Return the total amount we've consumed. If we don't consume all the 
bytes
diff --git a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp 
b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
index 3900d4db5..e818906f6 100644
--- a/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
+++ b/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
@@ -114,9 +114,10 @@ private :
     
     // Overflow buffer for when curl writes more data to us
     // than we've asked for.
-    XMLByte             fBuffer[CURL_MAX_WRITE_SIZE];
+    XMLByte*            fBuffer;
     XMLByte*            fBufferHeadPtr;
     XMLByte*            fBufferTailPtr;
+    XMLSize_t           fBufferSize;
 
     // Upload data
     const char*         fPayload;


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscr...@xerces.apache.org
For additional commands, e-mail: c-dev-h...@xerces.apache.org

Reply via email to