Fix memory issues 28/319128/1
authorKrzysztof Malysa <k.malysa@samsung.com>
Tue, 15 Oct 2024 13:29:41 +0000 (15:29 +0200)
committerKrzysztof Malysa <k.malysa@samsung.com>
Tue, 15 Oct 2024 14:20:40 +0000 (16:20 +0200)
All were found using ASAN and UBSAN.

Change-Id: I9c7016cd8df4751083eb280f1dfb22bd28b53fe6

srcs/common/message-buffer.h
srcs/common/utils.cpp
srcs/server/socket-manager.cpp

index 2a40610e1c83eeca20920d512bbe610879239006..cd5b34021c1884613380a57e727795d1cc0f1f6d 100644 (file)
@@ -93,8 +93,14 @@ public:
     }
 
     MessageBuffer &operator=(MessageBuffer&& other) {
-        this->~MessageBuffer();
-        return *new (this) MessageBuffer(std::move(other));
+        if (m_buffer) {
+            free(m_buffer);
+        }
+        m_buffer = other.m_buffer;
+        m_offset = other.m_offset;
+        m_bufferSize = other.m_bufferSize;
+        other.m_buffer = nullptr;
+        return *this;
     }
 
     ~MessageBuffer() {
@@ -333,10 +339,14 @@ public:
         assert(m_offset >= sizeof(size_t));
         assert(m_offset <= m_bufferSize);
 
+        if (num == 0)
+            return;
+
         const auto newOffset = m_offset + num;
         if (newOffset > m_bufferSize)
             ReserveMessageSize(newOffset);
 
+        assert(bytes);
         memcpy(&m_buffer[m_offset], bytes, num);
         m_offset = newOffset;
     }
@@ -378,6 +388,9 @@ private:
         if (!newBuffer)
             throw std::bad_alloc();
 
+        if (m_buffer) {
+            free(m_buffer);
+        }
         m_buffer = newBuffer;
         m_bufferSize = newBufferSize;
     }
index d8ad898ff896d31fbf48c2b62e1a4dff99407841..3a220a92b70181c16a0f7aaafd93f2e191e90d0d 100644 (file)
@@ -31,7 +31,7 @@ void CheckParameters(const char *str, const char *name, const bool checkBlank)
     int len = strlen(str);
     if (checkBlank && (0 == len))
         ThrowMsg(ClientException::InvalidParameter, "Invalid blank string: " << name);
-    if (' ' == str[0] || ' ' == str[len - 1])
+    if (len != 0 && (' ' == str[0] || ' ' == str[len - 1]))
         LogWarning("Leading/tailing whitespaces on " << name << ": \"" << str << "\"");
 }
 
index 723a16caa52d084273eaf6a8053efd44e36e30fa..36151958255b5bd0758ce6d038b6e87181203ec7 100644 (file)
@@ -177,8 +177,8 @@ void SocketManager::ReadyForRead(int sock) {
             case MessageBuffer::InputResult::Done:
                 buffer.ModeStreaming();
                 FD_CLR(sock, &m_readSet); // the one and only call on this socket is complete
-                const auto event = new Event{ ConnectionID{sock, desc.counter}, std::move(buffer) };
-                m_service->ProcessEvent(std::move(*event));
+                auto event = Event{ ConnectionID{sock, desc.counter}, std::move(buffer) };
+                m_service->ProcessEvent(std::move(event));
                 break;
         }
     }