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