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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]