1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-01 17:38:41 +00:00

Fix buggy memcpy call in a template (#15672)

This commit is contained in:
cosin15 2025-01-14 20:26:29 +01:00 committed by GitHub
parent 2bfcd45b35
commit 7053348e31
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -36,10 +36,11 @@ public:
Buffer(unsigned int size) Buffer(unsigned int size)
{ {
m_size = size; m_size = size;
if(size != 0) if (size != 0) {
data = new T[size]; data = new T[size];
else } else {
data = nullptr; data = nullptr;
}
} }
// Disable class copy // Disable class copy
@ -49,26 +50,24 @@ public:
Buffer(Buffer &&buffer) Buffer(Buffer &&buffer)
{ {
m_size = buffer.m_size; m_size = buffer.m_size;
if(m_size != 0) if (m_size != 0) {
{
data = buffer.data; data = buffer.data;
buffer.data = nullptr; buffer.data = nullptr;
buffer.m_size = 0; buffer.m_size = 0;
} } else {
else
data = nullptr; data = nullptr;
}
} }
// Copies whole buffer // Copies whole buffer
Buffer(const T *t, unsigned int size) Buffer(const T *t, unsigned int size)
{ {
m_size = size; m_size = size;
if(size != 0) if (size != 0) {
{
data = new T[size]; data = new T[size];
memcpy(data, t, size); memcpy(data, t, sizeof(T) * size);
} } else {
else
data = nullptr; data = nullptr;
}
} }
~Buffer() ~Buffer()
@ -78,18 +77,18 @@ public:
Buffer& operator=(Buffer &&buffer) Buffer& operator=(Buffer &&buffer)
{ {
if(this == &buffer) if (this == &buffer) {
return *this; return *this;
}
drop(); drop();
m_size = buffer.m_size; m_size = buffer.m_size;
if(m_size != 0) if (m_size != 0) {
{
data = buffer.data; data = buffer.data;
buffer.data = nullptr; buffer.data = nullptr;
buffer.m_size = 0; buffer.m_size = 0;
} } else {
else
data = nullptr; data = nullptr;
}
return *this; return *this;
} }
@ -99,7 +98,7 @@ public:
buffer.m_size = m_size; buffer.m_size = m_size;
if (m_size != 0) { if (m_size != 0) {
buffer.data = new T[m_size]; buffer.data = new T[m_size];
memcpy(buffer.data, data, m_size); memcpy(buffer.data, data, sizeof(T) * m_size);
} else { } else {
buffer.data = nullptr; buffer.data = nullptr;
} }
@ -121,8 +120,9 @@ public:
operator std::string_view() const operator std::string_view() const
{ {
if (!data) if (!data) {
return std::string_view(); return std::string_view();
}
return std::string_view(reinterpret_cast<char*>(data), m_size); return std::string_view(reinterpret_cast<char*>(data), m_size);
} }
@ -156,12 +156,14 @@ public:
SharedBuffer(unsigned int size) SharedBuffer(unsigned int size)
{ {
m_size = size; m_size = size;
if(m_size != 0) if (m_size != 0) {
data = new T[m_size]; data = new T[m_size];
else } else {
data = nullptr; data = nullptr;
}
refcount = new unsigned int; refcount = new unsigned int;
memset(data,0,sizeof(T)*m_size); memset(data, 0, sizeof(T) * m_size);
(*refcount) = 1; (*refcount) = 1;
} }
SharedBuffer(const SharedBuffer &buffer) SharedBuffer(const SharedBuffer &buffer)
@ -173,8 +175,10 @@ public:
} }
SharedBuffer & operator=(const SharedBuffer & buffer) SharedBuffer & operator=(const SharedBuffer & buffer)
{ {
if(this == &buffer) if (this == &buffer) {
return *this; return *this;
}
drop(); drop();
m_size = buffer.m_size; m_size = buffer.m_size;
data = buffer.data; data = buffer.data;
@ -182,36 +186,22 @@ public:
(*refcount)++; (*refcount)++;
return *this; return *this;
} }
/* //! Copies whole buffer
Copies whole buffer
*/
SharedBuffer(const T *t, unsigned int size) SharedBuffer(const T *t, unsigned int size)
{ {
m_size = size; m_size = size;
if(m_size != 0) if (m_size != 0) {
{
data = new T[m_size]; data = new T[m_size];
memcpy(data, t, m_size); memcpy(data, t, sizeof(T) * m_size);
} } else {
else
data = nullptr; data = nullptr;
}
refcount = new unsigned int; refcount = new unsigned int;
(*refcount) = 1; (*refcount) = 1;
} }
/* //! Copies whole buffer
Copies whole buffer SharedBuffer(const Buffer<T> &buffer) : SharedBuffer(*buffer, buffer.getSize())
*/
SharedBuffer(const Buffer<T> &buffer)
{ {
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() ~SharedBuffer()
{ {
@ -239,8 +229,7 @@ private:
{ {
assert((*refcount) > 0); assert((*refcount) > 0);
(*refcount)--; (*refcount)--;
if(*refcount == 0) if (*refcount == 0) {
{
delete[] data; delete[] data;
delete refcount; delete refcount;
} }