std: Fix potential Use-After-Free vulnerability in std::string

This commit is contained in:
EnderIce2 2024-10-15 03:59:26 +03:00
parent b31d49be15
commit b13fe4a28f
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD

View File

@ -978,7 +978,10 @@ namespace std
~basic_string() ~basic_string()
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
} }
basic_string &operator=(const basic_string &str) basic_string &operator=(const basic_string &str)
@ -986,7 +989,11 @@ namespace std
if (this != &str) if (this != &str)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = str._size; _size = str._size;
_capacity = str._capacity; _capacity = str._capacity;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -998,7 +1005,11 @@ namespace std
basic_string &operator=(const CharT *s) basic_string &operator=(const CharT *s)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = Traits::length(s); _size = Traits::length(s);
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1010,7 +1021,11 @@ namespace std
basic_string &operator=(CharT ch) basic_string &operator=(CharT ch)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = 1; _size = 1;
_capacity = 2; _capacity = 2;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1022,7 +1037,11 @@ namespace std
basic_string &operator=(std::initializer_list<CharT> ilist) basic_string &operator=(std::initializer_list<CharT> ilist)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = ilist._size(); _size = ilist._size();
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1035,7 +1054,11 @@ namespace std
basic_string &operator=(const StringViewLike &t) basic_string &operator=(const StringViewLike &t)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = t._size(); _size = t._size();
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1049,7 +1072,11 @@ namespace std
constexpr basic_string &assign(size_type count, CharT ch) constexpr basic_string &assign(size_type count, CharT ch)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = count; _size = count;
_capacity = count + 1; _capacity = count + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1061,7 +1088,11 @@ namespace std
constexpr basic_string &assign(const basic_string &str) constexpr basic_string &assign(const basic_string &str)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = str._size; _size = str._size;
_capacity = str._capacity; _capacity = str._capacity;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1073,7 +1104,11 @@ namespace std
constexpr basic_string &assign(const basic_string &str, size_type pos, size_type count = npos) constexpr basic_string &assign(const basic_string &str, size_type pos, size_type count = npos)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = count; _size = count;
_capacity = count + 1; _capacity = count + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1085,7 +1120,11 @@ namespace std
constexpr basic_string &assign(const CharT *s, size_type count) constexpr basic_string &assign(const CharT *s, size_type count)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = count; _size = count;
_capacity = count + 1; _capacity = count + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1097,7 +1136,11 @@ namespace std
constexpr basic_string &assign(const CharT *s) constexpr basic_string &assign(const CharT *s)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = Traits::length(s); _size = Traits::length(s);
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1110,7 +1153,11 @@ namespace std
constexpr basic_string &assign(InputIt first, InputIt last) constexpr basic_string &assign(InputIt first, InputIt last)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = std::distance(first, last); _size = std::distance(first, last);
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1122,7 +1169,11 @@ namespace std
constexpr basic_string &assign(std::initializer_list<CharT> ilist) constexpr basic_string &assign(std::initializer_list<CharT> ilist)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = ilist._size(); _size = ilist._size();
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1135,7 +1186,11 @@ namespace std
constexpr basic_string &assign(const StringViewLike &t) constexpr basic_string &assign(const StringViewLike &t)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = t._size(); _size = t._size();
_capacity = _size + 1; _capacity = _size + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1148,7 +1203,11 @@ namespace std
constexpr basic_string &assign(const StringViewLike &t, size_type pos, size_type count = npos) constexpr basic_string &assign(const StringViewLike &t, size_type pos, size_type count = npos)
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = count; _size = count;
_capacity = count + 1; _capacity = count + 1;
_data = _alloc.allocate(_capacity); _data = _alloc.allocate(_capacity);
@ -1337,7 +1396,11 @@ namespace std
memcpy(new_data, _data, _size); memcpy(new_data, _data, _size);
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_data = new_data; _data = new_data;
_capacity = new_cap; _capacity = new_cap;
} }
@ -1356,7 +1419,11 @@ namespace std
memcpy(new_data, _data, _size); memcpy(new_data, _data, _size);
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_data = new_data; _data = new_data;
_capacity = _size; _capacity = _size;
} }
@ -1369,7 +1436,11 @@ namespace std
constexpr void clear() constexpr void clear()
{ {
if (_data != nullptr) if (_data != nullptr)
{
_alloc.deallocate(_data, _capacity); _alloc.deallocate(_data, _capacity);
_data = nullptr;
}
_size = 0; _size = 0;
_capacity = 0; _capacity = 0;
} }