forked from such-gitea/wownero
ensure no NULL is passed to memcpy
NULL is valid when size is 0, but memcpy uses nonnull attributes, so let's not poke the bear
This commit is contained in:
@@ -64,7 +64,8 @@ void buffer::append(const void *data, size_t sz)
|
|||||||
size_t reserve = (((size() + sz) * 3 / 2) + 4095) & ~4095;
|
size_t reserve = (((size() + sz) * 3 / 2) + 4095) & ~4095;
|
||||||
new_storage.reserve(reserve);
|
new_storage.reserve(reserve);
|
||||||
new_storage.resize(size());
|
new_storage.resize(size());
|
||||||
memcpy(new_storage.data(), storage.data() + offset, storage.size() - offset);
|
if (size() > 0)
|
||||||
|
memcpy(new_storage.data(), storage.data() + offset, storage.size() - offset);
|
||||||
offset = 0;
|
offset = 0;
|
||||||
std::swap(storage, new_storage);
|
std::swap(storage, new_storage);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,13 +62,15 @@ wipeable_string::wipeable_string(wipeable_string &&other)
|
|||||||
wipeable_string::wipeable_string(const std::string &other)
|
wipeable_string::wipeable_string(const std::string &other)
|
||||||
{
|
{
|
||||||
grow(other.size());
|
grow(other.size());
|
||||||
memcpy(buffer.data(), other.c_str(), size());
|
if (size() > 0)
|
||||||
|
memcpy(buffer.data(), other.c_str(), size());
|
||||||
}
|
}
|
||||||
|
|
||||||
wipeable_string::wipeable_string(std::string &&other)
|
wipeable_string::wipeable_string(std::string &&other)
|
||||||
{
|
{
|
||||||
grow(other.size());
|
grow(other.size());
|
||||||
memcpy(buffer.data(), other.c_str(), size());
|
if (size() > 0)
|
||||||
|
memcpy(buffer.data(), other.c_str(), size());
|
||||||
if (!other.empty())
|
if (!other.empty())
|
||||||
{
|
{
|
||||||
memwipe(&other[0], other.size()); // we're kinda left with this again aren't we
|
memwipe(&other[0], other.size()); // we're kinda left with this again aren't we
|
||||||
@@ -79,7 +81,8 @@ wipeable_string::wipeable_string(std::string &&other)
|
|||||||
wipeable_string::wipeable_string(const char *s)
|
wipeable_string::wipeable_string(const char *s)
|
||||||
{
|
{
|
||||||
grow(strlen(s));
|
grow(strlen(s));
|
||||||
memcpy(buffer.data(), s, size());
|
if (size() > 0)
|
||||||
|
memcpy(buffer.data(), s, size());
|
||||||
}
|
}
|
||||||
|
|
||||||
wipeable_string::wipeable_string(const char *s, size_t len)
|
wipeable_string::wipeable_string(const char *s, size_t len)
|
||||||
@@ -112,14 +115,18 @@ void wipeable_string::grow(size_t sz, size_t reserved)
|
|||||||
}
|
}
|
||||||
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));
|
|
||||||
if (old_sz > 0)
|
if (old_sz > 0)
|
||||||
|
{
|
||||||
|
memcpy(tmp.get(), buffer.data(), old_sz * sizeof(char));
|
||||||
memwipe(buffer.data(), old_sz * sizeof(char));
|
memwipe(buffer.data(), old_sz * sizeof(char));
|
||||||
|
}
|
||||||
buffer.reserve(reserved);
|
buffer.reserve(reserved);
|
||||||
buffer.resize(sz);
|
buffer.resize(sz);
|
||||||
memcpy(buffer.data(), tmp.get(), old_sz * sizeof(char));
|
|
||||||
if (old_sz > 0)
|
if (old_sz > 0)
|
||||||
|
{
|
||||||
|
memcpy(buffer.data(), tmp.get(), old_sz * sizeof(char));
|
||||||
memwipe(tmp.get(), old_sz * sizeof(char));
|
memwipe(tmp.get(), old_sz * sizeof(char));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wipeable_string::push_back(char c)
|
void wipeable_string::push_back(char c)
|
||||||
|
|||||||
@@ -1077,11 +1077,11 @@ void BlockchainLMDB::add_tx_amount_output_indices(const uint64_t tx_id,
|
|||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
int num_outputs = amount_output_indices.size();
|
size_t num_outputs = amount_output_indices.size();
|
||||||
|
|
||||||
MDB_val_set(k_tx_id, tx_id);
|
MDB_val_set(k_tx_id, tx_id);
|
||||||
MDB_val v;
|
MDB_val v;
|
||||||
v.mv_data = (void *)amount_output_indices.data();
|
v.mv_data = num_outputs ? (void *)amount_output_indices.data() : (void*)"";
|
||||||
v.mv_size = sizeof(uint64_t) * num_outputs;
|
v.mv_size = sizeof(uint64_t) * num_outputs;
|
||||||
// LOG_PRINT_L1("tx_outputs[tx_hash] size: " << v.mv_size);
|
// LOG_PRINT_L1("tx_outputs[tx_hash] size: " << v.mv_size);
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ void keccak(const uint8_t *in, size_t inlen, uint8_t *md, int mdlen)
|
|||||||
local_abort("Bad keccak use");
|
local_abort("Bad keccak use");
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(temp, in, inlen);
|
if (inlen > 0)
|
||||||
|
memcpy(temp, in, inlen);
|
||||||
temp[inlen++] = 1;
|
temp[inlen++] = 1;
|
||||||
memset(temp + inlen, 0, rsiz - inlen);
|
memset(temp + inlen, 0, rsiz - inlen);
|
||||||
temp[rsiz - 1] |= 0x80;
|
temp[rsiz - 1] |= 0x80;
|
||||||
|
|||||||
Reference in New Issue
Block a user