summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2013-11-12 00:06:14 +0100
committerPilzAdam <pilzadam@minetest.net>2013-11-16 15:52:41 +0100
commit90e7832408eb313676d40b747ec533c3b07e5c28 (patch)
treeb2cf6b99bbeb79e2cf519b040c8400cbae22ea9c
parent35606cfb679d2d5ead0780c84371089745630c1b (diff)
downloadminetest-90e7832408eb313676d40b747ec533c3b07e5c28.tar.gz
minetest-90e7832408eb313676d40b747ec533c3b07e5c28.tar.bz2
minetest-90e7832408eb313676d40b747ec533c3b07e5c28.zip
Fix invalid listname and listsize not handled correctly in set_size
-rw-r--r--doc/lua_api.txt1
-rw-r--r--src/inventory.cpp3
-rw-r--r--src/script/lua_api/l_inventory.cpp20
3 files changed, 21 insertions, 3 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index db9a5e8fa..7da978672 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1726,6 +1726,7 @@ methods:
- is_empty(listname): return true if list is empty
- get_size(listname): get size of a list
- set_size(listname, size): set size of a list
+ ^ returns false on error (e.g. invalid listname or listsize)
- get_width(listname): get width of a list
- set_width(listname, width): set width of list; currently used for crafting
- get_stack(listname, i): get a copy of stack index i in list
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 2ce50e019..f4a87bec1 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -957,6 +957,9 @@ InventoryList * Inventory::addList(const std::string &name, u32 size)
}
else
{
+ //don't create list with invalid name
+ if (name.find(" ") != std::string::npos) return NULL;
+
InventoryList *list = new InventoryList(name, size, m_itemdef);
m_lists.push_back(list);
return list;
diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp
index 67b78bcaf..d783cf60f 100644
--- a/src/script/lua_api/l_inventory.cpp
+++ b/src/script/lua_api/l_inventory.cpp
@@ -117,24 +117,38 @@ int InvRef::l_set_size(lua_State *L)
NO_MAP_LOCK_REQUIRED;
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
+
int newsize = luaL_checknumber(L, 3);
+ if (newsize < 0) {
+ lua_pushboolean(L, false);
+ return 1;
+ }
+
Inventory *inv = getinv(L, ref);
if(inv == NULL){
- return 0;
+ lua_pushboolean(L, false);
+ return 1;
}
if(newsize == 0){
inv->deleteList(listname);
reportInventoryChange(L, ref);
- return 0;
+ lua_pushboolean(L, true);
+ return 1;
}
InventoryList *list = inv->getList(listname);
if(list){
list->setSize(newsize);
} else {
list = inv->addList(listname, newsize);
+ if (!list)
+ {
+ lua_pushboolean(L, false);
+ return 1;
+ }
}
reportInventoryChange(L, ref);
- return 0;
+ lua_pushboolean(L, true);
+ return 1;
}
// set_width(self, listname, size)