mg_schematic: fix leak in lua API, and small cleanup
authorest31 <MTest31@outlook.com>
Mon, 28 Mar 2016 12:39:43 +0000 (14:39 +0200)
committerest31 <MTest31@outlook.com>
Wed, 30 Mar 2016 14:26:05 +0000 (16:26 +0200)
* Fix leak like behaviour if you load multiple schematics in a loop.

* Cleanup check in for, fixing theoretical out of bounds read if
Schematic::deserializeFromMts reduced the number of elements
in m_nodenames. A != check may need an overflow of the counter
before it hits, if origsize is larger than m_nodenames.size().

* Fix function name passed to errorstream: it was wrong. Also use
__FUNCTION__ instead of manually using the method name at other
places in the function.

* Don't shadow the name member in the loop.

src/mg_schematic.cpp

index 019ed4dee9887c023d8bea92b70641229704c548..0b95fa267f7796e9f946d71b2022006be0e6885c 100644 (file)
@@ -267,7 +267,7 @@ bool Schematic::deserializeFromMts(std::istream *is,
        //// Read signature
        u32 signature = readU32(ss);
        if (signature != MTSCHEM_FILE_SIGNATURE) {
-               errorstream << "Schematic::deserializeFromMts: invalid schematic "
+               errorstream << __FUNCTION__ << ": invalid schematic "
                        "file" << std::endl;
                return false;
        }
@@ -275,7 +275,7 @@ bool Schematic::deserializeFromMts(std::istream *is,
        //// Read version
        u16 version = readU16(ss);
        if (version > MTSCHEM_FILE_VER_HIGHEST_READ) {
-               errorstream << "Schematic::deserializeFromMts: unsupported schematic "
+               errorstream << __FUNCTION__ << ": unsupported schematic "
                        "file version" << std::endl;
                return false;
        }
@@ -439,7 +439,7 @@ bool Schematic::loadSchematicFromFile(const std::string &filename,
 {
        std::ifstream is(filename.c_str(), std::ios_base::binary);
        if (!is.good()) {
-               errorstream << "Schematic::loadSchematicFile: unable to open file '"
+               errorstream << __FUNCTION__ << ": unable to open file '"
                        << filename << "'" << std::endl;
                return false;
        }
@@ -448,17 +448,19 @@ bool Schematic::loadSchematicFromFile(const std::string &filename,
        if (!deserializeFromMts(&is, &m_nodenames))
                return false;
 
+       m_nnlistsizes.push_back(m_nodenames.size() - origsize);
+
+       name = filename;
+
        if (replace_names) {
-               for (size_t i = origsize; i != m_nodenames.size(); i++) {
-                       std::string &name = m_nodenames[i];
-                       StringMap::iterator it = replace_names->find(name);
+               for (size_t i = origsize; i < m_nodenames.size(); i++) {
+                       std::string &node_name = m_nodenames[i];
+                       StringMap::iterator it = replace_names->find(node_name);
                        if (it != replace_names->end())
-                               name = it->second;
+                               node_name = it->second;
                }
        }
 
-       m_nnlistsizes.push_back(m_nodenames.size() - origsize);
-
        if (ndef)
                ndef->pendNodeResolve(this);