From 472fffb37530256702006ef00b6fcf949ecbc26c Mon Sep 17 00:00:00 2001 From: David Reiss Date: Tue, 9 Mar 2010 05:20:24 +0000 Subject: [PATCH] cpp: Don't leak memory on realloc failure in TNonblockingServer git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@920689 13f79535-47bb-0310-9956-ffa450edef68 --- lib/cpp/src/server/TNonblockingServer.cpp | 11 +++++++---- lib/cpp/src/server/TNonblockingServer.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/cpp/src/server/TNonblockingServer.cpp b/lib/cpp/src/server/TNonblockingServer.cpp index 8f68d744..eeb3e69a 100644 --- a/lib/cpp/src/server/TNonblockingServer.cpp +++ b/lib/cpp/src/server/TNonblockingServer.cpp @@ -128,15 +128,18 @@ void TConnection::workSocket() { // Double the buffer size until it is big enough if (readWant_ > readBufferSize_) { - while (readWant_ > readBufferSize_) { - readBufferSize_ *= 2; + uint32_t newSize = readBufferSize_; + while (readWant_ > newSize) { + newSize *= 2; } - readBuffer_ = (uint8_t*)std::realloc(readBuffer_, readBufferSize_); - if (readBuffer_ == NULL) { + uint8_t* newBuffer = (uint8_t*)std::realloc(readBuffer_, newSize); + if (newBuffer == NULL) { GlobalOutput("TConnection::workSocket() realloc"); close(); return; } + readBuffer_ = newBuffer; + readBufferSize_ = newSize; } // Read from the socket diff --git a/lib/cpp/src/server/TNonblockingServer.h b/lib/cpp/src/server/TNonblockingServer.h index 41a2bf58..70f46c6d 100644 --- a/lib/cpp/src/server/TNonblockingServer.h +++ b/lib/cpp/src/server/TNonblockingServer.h @@ -708,6 +708,7 @@ class TConnection { } ~TConnection() { + std::free(readBuffer_); server_->decrementNumConnections(); } -- 2.17.1