From 7053348e31b21954180211e571dbacca1aa531d5 Mon Sep 17 00:00:00 2001 From: cosin15 <143353310+cosin15@users.noreply.github.com> Date: Tue, 14 Jan 2025 20:26:29 +0100 Subject: [PATCH] Fix buggy memcpy call in a template (#15672) --- src/util/pointer.h | 79 ++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 45 deletions(-) diff --git a/src/util/pointer.h b/src/util/pointer.h index 306ef55f97e9b..957277a402195 100644 --- a/src/util/pointer.h +++ b/src/util/pointer.h @@ -36,10 +36,11 @@ class Buffer Buffer(unsigned int size) { m_size = size; - if(size != 0) + if (size != 0) { data = new T[size]; - else + } else { data = nullptr; + } } // Disable class copy @@ -49,26 +50,24 @@ class Buffer Buffer(Buffer &&buffer) { m_size = buffer.m_size; - if(m_size != 0) - { + if (m_size != 0) { data = buffer.data; buffer.data = nullptr; buffer.m_size = 0; - } - else + } else { data = nullptr; + } } // Copies whole buffer Buffer(const T *t, unsigned int size) { m_size = size; - if(size != 0) - { + if (size != 0) { data = new T[size]; - memcpy(data, t, size); - } - else + memcpy(data, t, sizeof(T) * size); + } else { data = nullptr; + } } ~Buffer() @@ -78,18 +77,18 @@ class Buffer Buffer& operator=(Buffer &&buffer) { - if(this == &buffer) + if (this == &buffer) { return *this; + } drop(); m_size = buffer.m_size; - if(m_size != 0) - { + if (m_size != 0) { data = buffer.data; buffer.data = nullptr; buffer.m_size = 0; - } - else + } else { data = nullptr; + } return *this; } @@ -99,7 +98,7 @@ class Buffer buffer.m_size = m_size; if (m_size != 0) { buffer.data = new T[m_size]; - memcpy(buffer.data, data, m_size); + memcpy(buffer.data, data, sizeof(T) * m_size); } else { buffer.data = nullptr; } @@ -121,8 +120,9 @@ class Buffer operator std::string_view() const { - if (!data) + if (!data) { return std::string_view(); + } return std::string_view(reinterpret_cast(data), m_size); } @@ -156,12 +156,14 @@ class SharedBuffer SharedBuffer(unsigned int size) { m_size = size; - if(m_size != 0) + if (m_size != 0) { data = new T[m_size]; - else + } else { data = nullptr; + } + refcount = new unsigned int; - memset(data,0,sizeof(T)*m_size); + memset(data, 0, sizeof(T) * m_size); (*refcount) = 1; } SharedBuffer(const SharedBuffer &buffer) @@ -173,8 +175,10 @@ class SharedBuffer } SharedBuffer & operator=(const SharedBuffer & buffer) { - if(this == &buffer) + if (this == &buffer) { return *this; + } + drop(); m_size = buffer.m_size; data = buffer.data; @@ -182,36 +186,22 @@ class SharedBuffer (*refcount)++; return *this; } - /* - Copies whole buffer - */ + //! Copies whole buffer SharedBuffer(const T *t, unsigned int size) { m_size = size; - if(m_size != 0) - { + if (m_size != 0) { data = new T[m_size]; - memcpy(data, t, m_size); - } - else + memcpy(data, t, sizeof(T) * m_size); + } else { data = nullptr; + } refcount = new unsigned int; (*refcount) = 1; } - /* - Copies whole buffer - */ - SharedBuffer(const Buffer &buffer) + //! Copies whole buffer + SharedBuffer(const Buffer &buffer) : SharedBuffer(*buffer, buffer.getSize()) { - m_size = buffer.getSize(); - if (m_size != 0) { - data = new T[m_size]; - memcpy(data, *buffer, buffer.getSize()); - } - else - data = nullptr; - refcount = new unsigned int; - (*refcount) = 1; } ~SharedBuffer() { @@ -239,8 +229,7 @@ class SharedBuffer { assert((*refcount) > 0); (*refcount)--; - if(*refcount == 0) - { + if (*refcount == 0) { delete[] data; delete refcount; }