Cleanup in content_mapblock (#5746)
[oweals/minetest.git] / src / staticobject.cpp
index 16d98605b6b75c775abac30c9595edcbb803a98a..d656b62214950c47cb95ab59d7f233a842b77933 100644 (file)
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "staticobject.h"
 #include "util/serialize.h"
+#include "log.h"
 
 void StaticObject::serialize(std::ostream &os)
 {
@@ -44,13 +45,23 @@ void StaticObjectList::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);
        }
@@ -68,8 +79,7 @@ void StaticObjectList::deSerialize(std::istream &is)
        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);