forked from Mirrorlandia_minetest/minetest
Fix segfault in drawItems() due to missing inventory list
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.
This commit is contained in:
parent
0fa54531d4
commit
481bb90eac
@ -224,6 +224,7 @@ void Hud::drawItem(const ItemStack &item, const core::rect<s32>& rect,
|
|||||||
}
|
}
|
||||||
|
|
||||||
//NOTE: selectitem = 0 -> no selected; selectitem 1-based
|
//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,
|
void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount,
|
||||||
s32 inv_offset, InventoryList *mainlist, u16 selectitem, u16 direction)
|
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
|
// Draw items
|
||||||
core::rect<s32> imgrect(0, 0, m_hotbar_imagesize, m_hotbar_imagesize);
|
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;
|
s32 fullimglen = m_hotbar_imagesize + m_padding * 2;
|
||||||
|
|
||||||
v2s32 steppos;
|
v2s32 steppos;
|
||||||
@ -401,6 +403,8 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
|
|||||||
break; }
|
break; }
|
||||||
case HUD_ELEM_INVENTORY: {
|
case HUD_ELEM_INVENTORY: {
|
||||||
InventoryList *inv = inventory->getList(e->text);
|
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,
|
drawItems(pos, v2s32(e->offset.X, e->offset.Y), e->number, 0,
|
||||||
inv, e->item, e->dir);
|
inv, e->item, e->dir);
|
||||||
break; }
|
break; }
|
||||||
|
Loading…
Reference in New Issue
Block a user