diff options
author | est31 <MTest31@outlook.com> | 2016-03-28 14:39:43 +0200 |
---|---|---|
committer | est31 <MTest31@outlook.com> | 2016-03-30 16:26:05 +0200 |
commit | 0aac1b74037ba0f6b0526e81ad0ea7367e31c224 (patch) | |
tree | 68fdb96cb3121615a98d250092ad5a6d3c5e6e76 /src | |
parent | 0115da1d6348a08388238d8728daaa048a603522 (diff) | |
download | minetest-0aac1b74037ba0f6b0526e81ad0ea7367e31c224.tar.gz minetest-0aac1b74037ba0f6b0526e81ad0ea7367e31c224.tar.bz2 minetest-0aac1b74037ba0f6b0526e81ad0ea7367e31c224.zip |
mg_schematic: fix leak in lua API, and small cleanup
* 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.
Diffstat (limited to 'src')
-rw-r--r-- | src/mg_schematic.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index 019ed4dee..0b95fa267 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -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); |