Fix invalid listname and listsize not handled correctly in set_size
authorsapier <Sapier at GMX dot net>
Mon, 11 Nov 2013 23:06:14 +0000 (00:06 +0100)
committerPilzAdam <pilzadam@minetest.net>
Sat, 16 Nov 2013 14:52:41 +0000 (15:52 +0100)
doc/lua_api.txt
src/inventory.cpp
src/script/lua_api/l_inventory.cpp

index db9a5e8fa04a51e9c2c6cd2ae443d398c8f6714b..7da978672e397536207197d9a0f146310a59719a 100644 (file)
@@ -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
index 2ce50e0191592589a892898556d144891cb11d7c..f4a87bec12d3587cda5f6bc74ca8e8bac0ab12f1 100644 (file)
@@ -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;
index 67b78bcafd444db8b942f7d7f42365985822205f..d783cf60ff693060565e90ec44f361f3a4579493 100644 (file)
@@ -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)