aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2016-03-28 14:39:43 +0200
committerest31 <MTest31@outlook.com>2016-03-30 16:26:05 +0200
commit0aac1b74037ba0f6b0526e81ad0ea7367e31c224 (patch)
tree68fdb96cb3121615a98d250092ad5a6d3c5e6e76
parent0115da1d6348a08388238d8728daaa048a603522 (diff)
downloadminetest-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.
-rw-r--r--src/mg_schematic.cpp20
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);