better resource management for SecureSocket buffer. fixes #16

This commit is contained in:
walker0643 2018-02-24 19:37:30 -05:00
parent b994c94a90
commit 916b085474
1 changed files with 24 additions and 25 deletions

View File

@ -30,6 +30,7 @@
#include <cstdlib> #include <cstdlib>
#include <memory> #include <memory>
#include <fstream> #include <fstream>
#include <memory>
// //
// SecureSocket // SecureSocket
@ -206,46 +207,44 @@ SecureSocket::doWrite()
{ {
static bool s_retry = false; static bool s_retry = false;
static int s_retrySize = 0; static int s_retrySize = 0;
static void* s_staticBuffer = NULL; static std::unique_ptr<char[]> s_staticBuffer;
static std::size_t s_staticBufferSize = 0;
// write data // write data
int bufferSize = 0; int bufferSize = 0;
int bytesWrote = 0; int bytesWrote = 0;
int status = 0; int status = 0;
if (!isSecureReady())
return kRetry;
if (s_retry) { if (s_retry) {
bufferSize = s_retrySize; bufferSize = s_retrySize;
} } else {
else {
bufferSize = m_outputBuffer.getSize(); bufferSize = m_outputBuffer.getSize();
s_staticBuffer = malloc(bufferSize); if (bufferSize > s_staticBufferSize) {
memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize); s_staticBuffer.reset(new char[bufferSize]);
s_staticBufferSize = bufferSize;
}
if (bufferSize > 0) {
memcpy(s_staticBuffer.get(), m_outputBuffer.peek(bufferSize), bufferSize);
}
} }
if (bufferSize == 0) { if (bufferSize == 0) {
return kRetry; return kRetry;
} }
if (isSecureReady()) { status = secureWrite(s_staticBuffer.get(), bufferSize, bytesWrote);
status = secureWrite(s_staticBuffer, bufferSize, bytesWrote);
if (status > 0) { if (status > 0) {
s_retry = false; s_retry = false;
bufferSize = 0; } else if (status < 0) {
free(s_staticBuffer);
s_staticBuffer = NULL;
}
else if (status < 0) {
return kBreak; return kBreak;
} } else if (status == 0) {
else if (status == 0) {
s_retry = true; s_retry = true;
s_retrySize = bufferSize; s_retrySize = bufferSize;
return kNew; return kNew;
} }
}
else {
return kRetry;
}
if (bytesWrote > 0) { if (bytesWrote > 0) {
discardWrittenData(bytesWrote); discardWrittenData(bytesWrote);