From 683e12d2f6a26c80bfa07f276845be618237ae5b Mon Sep 17 00:00:00 2001 From: bsbaliga <42407361+bsbaliga@users.noreply.github.com> Date: Tue, 26 Mar 2019 03:55:33 +0530 Subject: [PATCH] Fix memory leak when exception is thrown by impl classes in (#198) Serial::read() vector and string variants. --- src/serial.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/serial.cc b/src/serial.cc index aab4caa..37b5d70 100755 --- a/src/serial.cc +++ b/src/serial.cc @@ -132,7 +132,16 @@ Serial::read (std::vector &buffer, size_t size) { ScopedReadLock lock(this->pimpl_); uint8_t *buffer_ = new uint8_t[size]; - size_t bytes_read = this->pimpl_->read (buffer_, size); + size_t bytes_read = 0; + + try { + bytes_read = this->pimpl_->read (buffer_, size); + } + catch (const std::exception &e) { + delete[] buffer_; + throw; + } + buffer.insert (buffer.end (), buffer_, buffer_+bytes_read); delete[] buffer_; return bytes_read; @@ -143,7 +152,14 @@ Serial::read (std::string &buffer, size_t size) { ScopedReadLock lock(this->pimpl_); uint8_t *buffer_ = new uint8_t[size]; - size_t bytes_read = this->pimpl_->read (buffer_, size); + size_t bytes_read = 0; + try { + bytes_read = this->pimpl_->read (buffer_, size); + } + catch (const std::exception &e) { + delete[] buffer_; + throw; + } buffer.append (reinterpret_cast(buffer_), bytes_read); delete[] buffer_; return bytes_read;