epee: also limit number of strings in portable_storage

They require at least 24 bytes
This commit is contained in:
moneromooo-monero 2021-01-05 17:54:25 +00:00
parent f3de67bc21
commit 5d2dd7a328
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
1 changed files with 11 additions and 1 deletions

View File

@ -38,7 +38,8 @@
#define EPEE_PORTABLE_STORAGE_RECURSION_LIMIT_INTERNAL 100 #define EPEE_PORTABLE_STORAGE_RECURSION_LIMIT_INTERNAL 100
#endif #endif
#define EPEE_PORTABLE_STORAGE_OBJECT_LIMIT_INTERNAL 65536 #define EPEE_PORTABLE_STORAGE_OBJECT_LIMIT_INTERNAL 65536
#define EPEE_PORTABLE_STORAGE_OBJECT_FIELD_LIMIT_INTERNAL 262144 #define EPEE_PORTABLE_STORAGE_OBJECT_FIELD_LIMIT_INTERNAL 65536
#define EPEE_PORTABLE_STORAGE_STRING_LIMIT_INTERNAL 65536 // does not include field names
namespace epee namespace epee
{ {
@ -106,6 +107,7 @@ namespace epee
size_t m_recursion_count; size_t m_recursion_count;
size_t m_objects; size_t m_objects;
size_t m_fields; size_t m_fields;
size_t m_strings;
}; };
inline throwable_buffer_reader::throwable_buffer_reader(const void* ptr, size_t sz) inline throwable_buffer_reader::throwable_buffer_reader(const void* ptr, size_t sz)
@ -119,6 +121,7 @@ namespace epee
m_recursion_count = 0; m_recursion_count = 0;
m_objects = 0; m_objects = 0;
m_fields = 0; m_fields = 0;
m_strings = 0;
} }
inline inline
void throwable_buffer_reader::read(void* target, size_t count) void throwable_buffer_reader::read(void* target, size_t count)
@ -172,6 +175,11 @@ namespace epee
CHECK_AND_ASSERT_THROW_MES(size <= EPEE_PORTABLE_STORAGE_OBJECT_LIMIT_INTERNAL - m_objects, "Too many objects"); CHECK_AND_ASSERT_THROW_MES(size <= EPEE_PORTABLE_STORAGE_OBJECT_LIMIT_INTERNAL - m_objects, "Too many objects");
m_objects += size; m_objects += size;
} }
else if (std::is_same<type_name, std::string>())
{
CHECK_AND_ASSERT_THROW_MES(size <= EPEE_PORTABLE_STORAGE_STRING_LIMIT_INTERNAL - m_strings, "Too many strings");
m_strings += size;
}
sa.reserve(size); sa.reserve(size);
//TODO: add some optimization here later //TODO: add some optimization here later
@ -238,6 +246,8 @@ namespace epee
inline storage_entry throwable_buffer_reader::read_se<std::string>() inline storage_entry throwable_buffer_reader::read_se<std::string>()
{ {
RECURSION_LIMITATION(); RECURSION_LIMITATION();
CHECK_AND_ASSERT_THROW_MES(m_strings + 1 <= EPEE_PORTABLE_STORAGE_STRING_LIMIT_INTERNAL, "Too many strings");
m_strings += 1;
return storage_entry(read<std::string>()); return storage_entry(read<std::string>());
} }