Ver Fonte

Fix memory leak and potential undefined behavior in WString::Resize().

Lasse Öörni há 12 anos atrás
pai
commit
f6b0331448
2 ficheiros alterados com 11 adições e 7 exclusões
  1. 10 6
      Source/Engine/Container/Str.cpp
  2. 1 1
      Source/Engine/Container/Str.h

+ 10 - 6
Source/Engine/Container/Str.cpp

@@ -1259,9 +1259,9 @@ WString::~WString()
     delete[] buffer_;
 }
 
-void WString::Resize(unsigned newSize)
+void WString::Resize(unsigned newLength)
 {
-    if (!newSize)
+    if (!newLength)
     {
         delete[] buffer_;
         buffer_ = 0;
@@ -1269,12 +1269,16 @@ void WString::Resize(unsigned newSize)
     }
     else
     {
-        wchar_t* newBuffer = new wchar_t[newSize + 1];
+        wchar_t* newBuffer = new wchar_t[newLength + 1];
         if (buffer_)
-            memcpy(newBuffer, buffer_, length_ * sizeof(wchar_t));
-        newBuffer[newSize] = 0;
+        {
+            unsigned copyLength = length_ < newLength ? length_ : newLength;
+            memcpy(newBuffer, buffer_, copyLength * sizeof(wchar_t));
+            delete[] buffer_;
+        }
+        newBuffer[newLength] = 0;
         buffer_ = newBuffer;
-        length_ = newSize;
+        length_ = newLength;
     }
 }
 

+ 1 - 1
Source/Engine/Container/Str.h

@@ -524,7 +524,7 @@ public:
     /// Return const char at index.
     const wchar_t& At(unsigned index) const { assert(index < length_); return buffer_[index]; }
     /// Resize the string.
-    void Resize(unsigned newSize);
+    void Resize(unsigned newLength);
     /// Return whether the string is empty.
     bool Empty() const { return length_ == 0; }
     /// Return length.