#include "staticobject.h"
#include "util/serialize.h"
+#include "log.h"
void StaticObject::serialize(std::ostream &os)
{
// version
u8 version = 0;
writeU8(os, version);
+
// count
- u16 count = m_stored.size() + m_active.size();
+ size_t count = m_stored.size() + m_active.size();
+ // Make sure it fits into u16, else it would get truncated and cause e.g.
+ // issue #2610 (Invalid block data in database: unsupported NameIdMapping version).
+ if (count > U16_MAX) {
+ errorstream << "StaticObjectList::serialize(): "
+ << "too many objects (" << count << ") in list, "
+ << "not writing them to disk." << std::endl;
+ writeU16(os, 0); // count = 0
+ return;
+ }
writeU16(os, count);
- for(std::list<StaticObject>::iterator
+
+ for(std::vector<StaticObject>::iterator
i = m_stored.begin();
- i != m_stored.end(); ++i)
- {
+ i != m_stored.end(); ++i) {
StaticObject &s_obj = *i;
s_obj.serialize(os);
}
u8 version = readU8(is);
// count
u16 count = readU16(is);
- for(u16 i=0; i<count; i++)
- {
+ for(u16 i = 0; i < count; i++) {
StaticObject s_obj;
s_obj.deSerialize(is, version);
m_stored.push_back(s_obj);