Merge pull request #2961

6c94516f wipeable_string: move a wipe from reserve to grow (moneromooo-monero)
5f801b6a wipeable_string: ignore reserve size less than actual size (moneromooo-monero)
9ec44a2b wipeable_string: fix clear and push_back (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2017-12-19 22:03:07 +02:00
commit 7a9a4a6669
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD

View File

@ -85,11 +85,15 @@ void wipeable_string::wipe()
void wipeable_string::grow(size_t sz, size_t reserved) void wipeable_string::grow(size_t sz, size_t reserved)
{ {
CHECK_AND_ASSERT_THROW_MES(wipefunc, "wipefunc is not set"); CHECK_AND_ASSERT_THROW_MES(wipefunc, "wipefunc is not set");
if (reserved == 0) if (reserved < sz)
reserved = sz; reserved = sz;
CHECK_AND_ASSERT_THROW_MES(reserved >= sz, "reserved < sz");
if (reserved <= buffer.capacity()) if (reserved <= buffer.capacity())
{
if (sz < buffer.size())
wipefunc(buffer.data() + sz, buffer.size() - sz);
buffer.resize(sz);
return; return;
}
size_t old_sz = buffer.size(); size_t old_sz = buffer.size();
std::unique_ptr<char[]> tmp{new char[old_sz]}; std::unique_ptr<char[]> tmp{new char[old_sz]};
memcpy(tmp.get(), buffer.data(), old_sz * sizeof(char)); memcpy(tmp.get(), buffer.data(), old_sz * sizeof(char));
@ -103,7 +107,7 @@ void wipeable_string::grow(size_t sz, size_t reserved)
void wipeable_string::push_back(char c) void wipeable_string::push_back(char c)
{ {
grow(size() + 1); grow(size() + 1);
buffer.push_back(c); buffer.back() = c;
} }
void wipeable_string::pop_back() void wipeable_string::pop_back()
@ -113,9 +117,6 @@ void wipeable_string::pop_back()
void wipeable_string::resize(size_t sz) void wipeable_string::resize(size_t sz)
{ {
CHECK_AND_ASSERT_THROW_MES(wipefunc, "wipefunc is not set");
if (sz < buffer.size())
wipefunc(buffer.data() + sz, buffer.size() - sz);
grow(sz); grow(sz);
} }