mirror of
https://github.com/minetest/minetest.git
synced 2025-01-04 20:37:31 +01:00
Fix irrString use-after-free with char-like assignment (operator=)
This commit is contained in:
parent
84b9321977
commit
05cbd84ae0
@ -173,13 +173,24 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// no longer allowed!
|
if constexpr (sizeof(T) != sizeof(B)) {
|
||||||
_IRR_DEBUG_BREAK_IF((void *)c == (void *)c_str());
|
_IRR_DEBUG_BREAK_IF(
|
||||||
|
(uintptr_t)c >= (uintptr_t)(str.data()) &&
|
||||||
|
(uintptr_t)c < (uintptr_t)(str.data() + str.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((void *)c == (void *)c_str())
|
||||||
|
return *this;
|
||||||
|
|
||||||
u32 len = calclen(c);
|
u32 len = calclen(c);
|
||||||
str.resize(len);
|
// In case `c` is a pointer to our own buffer, we may not resize first
|
||||||
|
// or it can become invalid.
|
||||||
|
if (len > str.size())
|
||||||
|
str.resize(len);
|
||||||
for (u32 l = 0; l < len; ++l)
|
for (u32 l = 0; l < len; ++l)
|
||||||
str[l] = (T)c[l];
|
str[l] = static_cast<T>(c[l]);
|
||||||
|
if (len < str.size())
|
||||||
|
str.resize(len);
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user