]> git.lizzy.rs Git - minetest.git/commitdiff
Fix segfault in drawItems() due to missing inventory list
authorSmallJoker <mk939@ymail.com>
Wed, 29 Dec 2021 18:20:38 +0000 (19:20 +0100)
committerSmallJoker <mk939@ymail.com>
Wed, 29 Dec 2021 18:20:49 +0000 (19:20 +0100)
This fixes a nullptr dereference when the specified inventory list is not known.
Happens when HUD elements are sent before the required inventory list is created.

src/client/hud.cpp

index e08d2ef026b61af4a07f3a6120b317e5df8115e1..6011a8cffbe3be542eb8102032cbe4941c0e3962 100644 (file)
@@ -224,6 +224,7 @@ void Hud::drawItem(const ItemStack &item, const core::rect<s32>& rect,
 }
 
 //NOTE: selectitem = 0 -> no selected; selectitem 1-based
+// mainlist can be NULL, but draw the frame anyway.
 void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount,
                s32 inv_offset, InventoryList *mainlist, u16 selectitem, u16 direction)
 {
@@ -271,7 +272,8 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount,
 
        // Draw items
        core::rect<s32> imgrect(0, 0, m_hotbar_imagesize, m_hotbar_imagesize);
-       for (s32 i = inv_offset; i < itemcount && (size_t)i < mainlist->getSize(); i++) {
+       const s32 list_size = mainlist ? mainlist->getSize() : 0;
+       for (s32 i = inv_offset; i < itemcount && i < list_size; i++) {
                s32 fullimglen = m_hotbar_imagesize + m_padding * 2;
 
                v2s32 steppos;
@@ -401,6 +403,8 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
                                break; }
                        case HUD_ELEM_INVENTORY: {
                                InventoryList *inv = inventory->getList(e->text);
+                               if (!inv)
+                                       warningstream << "HUD: Unknown inventory list. name=" << e->text << std::endl;
                                drawItems(pos, v2s32(e->offset.X, e->offset.Y), e->number, 0,
                                        inv, e->item, e->dir);
                                break; }