From a3e0827422d1745c619f5bee4a225874e727e188 Mon Sep 17 00:00:00 2001 From: hemagx Date: Thu, 23 Jun 2016 11:58:01 +0200 Subject: Fix Possible Crash on clif_bl_type now it checks if vd is null --- src/map/clif.c | 42 ++++++++++++++++++++++++++++++------------ src/map/clif.h | 25 +++++++++++++++++++++---- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/map/clif.c b/src/map/clif.c index 259bc7253..41f7c1515 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -267,19 +267,37 @@ uint32 clif_refresh_ip(void) #if PACKETVER >= 20071106 static inline unsigned char clif_bl_type(struct block_list *bl) { - nullpo_retr(0x1, bl); + struct view_data *vd; + nullpo_retr(CLUT_NPC, bl); + switch (bl->type) { - case BL_PC: return (disguised(bl) && !pc->db_checkid(status->get_viewdata(bl)->class_))? 0x1:0x0; //PC_TYPE - case BL_ITEM: return 0x2; //ITEM_TYPE - case BL_SKILL: return 0x3; //SKILL_TYPE - case BL_CHAT: return 0x4; //UNKNOWN_TYPE - case BL_MOB: return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE - case BL_NPC: return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x6; //NPC_EVT_TYPE - case BL_PET: return pc->db_checkid(status->get_viewdata(bl)->class_)?0x0:0x7; //NPC_PET_TYPE - case BL_HOM: return 0x8; //NPC_HOM_TYPE - case BL_MER: return 0x9; //NPC_MERSOL_TYPE - case BL_ELEM: return 0xa; //NPC_ELEMENTAL_TYPE - default: return 0x1; //NPC_TYPE + case BL_PC: + vd = status->get_viewdata(bl); + nullpo_retr(CLUT_NPC, vd); + + if (disguised(bl) && !pc->db_checkid(vd->class_)) + return CLUT_NPC; + else + return CLUT_PC; + case BL_ITEM: return CLUT_ITEM; + case BL_SKILL: return CLUT_SKILL; + case BL_CHAT: return CLUT_UNKNOW; + case BL_MOB: + vd = status->get_viewdata(bl); + nullpo_retr(CLUT_NPC, vd); + return pc->db_checkid(vd->class_)? CLUT_PC:CLUT_MOB; + case BL_NPC: + vd = status->get_viewdata(bl); + nullpo_retr(CLUT_NPC, vd); + return pc->db_checkid(vd->class_)? CLUT_PC:CLUT_EVENT; + case BL_PET: + vd = status->get_viewdata(bl); + nullpo_retr(CLUT_NPC, vd); + return pc->db_checkid(vd->class_)? CLUT_PC:CLUT_PET; + case BL_HOM: return CLUT_HOMNUCLUS; + case BL_MER: return CLUT_MERCNARY; + case BL_ELEM: return CLUT_ELEMENTAL; + default: return CLUT_NPC; } } #endif diff --git a/src/map/clif.h b/src/map/clif.h index 4d22fd4af..bf61aee20 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -520,7 +520,7 @@ enum CLOSE_ROULETTE_ACK { /** * Reason for item deletion (clif->delitem) - */ + **/ enum delitem_reason { DELITEM_NORMAL = 0, /// Normal DELITEM_SKILLUSE = 1, /// Item used for a skill @@ -532,9 +532,9 @@ enum delitem_reason { DELITEM_ANALYSIS = 7, /// Consumed by Four Spirit Analysis (SO_EL_ANALYSIS) skill }; -/* -* Merge items reasons -*/ +/** + * Merge items reasons + **/ enum mergeitem_reason { MERGEITEM_SUCCESS = 0x0, @@ -542,6 +542,23 @@ enum mergeitem_reason { MERGEITEM_MAXCOUNTFAILD = 0x2, }; +/** + * Clif Unit Type + **/ +enum clif_unittype { + CLUT_PC = 0x0, + CLUT_NPC = 0x1, + CLUT_ITEM = 0x2, + CLUT_SKILL = 0x3, + CLUT_UNKNOW = 0x4, + CLUT_MOB = 0x5, + CLUT_EVENT = 0x6, + CLUT_PET = 0x7, + CLUT_HOMNUCLUS = 0x8, + CLUT_MERCNARY = 0x9, + CLUT_ELEMENTAL = 0xa, +}; + /** * Structures **/ -- cgit v1.2.3-60-g2f50