- u16 count = m_stored.size() + m_active.size();
- writeU16((u8*)buf, count);
- os.write(buf, 2);
- for(core::list<StaticObject>::Iterator
- i = m_stored.begin();
- i != m_stored.end(); i++)
- {
- StaticObject &s_obj = *i;
+ 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 (StaticObject &s_obj : m_stored) {