From 172f8c8ac189e1f6590324eb0aca14cffdba3083 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 6 Nov 2018 04:15:56 +0300 Subject: Add compile time validation for packet ZC_ITEM_PREVIEW. --- src/common/packetsstatic_len.h | 33 +++++++++++++++++++++++++++++++ src/map/HPMmap.c | 1 - src/map/clif.c | 2 +- src/map/packets_struct.h | 45 +++++++++++++++++++++++++++--------------- 4 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 src/common/packetsstatic_len.h diff --git a/src/common/packetsstatic_len.h b/src/common/packetsstatic_len.h new file mode 100644 index 000000000..9ccc4a673 --- /dev/null +++ b/src/common/packetsstatic_len.h @@ -0,0 +1,33 @@ +/** + * This file is part of Hercules. + * http://herc.ws - http://github.com/HerculesWS/Hercules + * + * Copyright (C) 2013-2018 Hercules Dev Team + * + * Hercules is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef COMMON_PACKETSSTATIC_LEN_H +#define COMMON_PACKETSSTATIC_LEN_H + +#ifdef packetLen +#error packetLen already defined +#endif + +#define packetLen(id, len) PACKET_LEN_##id = (len), +enum packet_lengths { +#include "common/packets_len.h" +}; +#undef packetLen + +#endif /* COMMON_PACKETSSTATIC_LEN_H */ diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c index 8ea524d23..6eff37df8 100644 --- a/src/map/HPMmap.c +++ b/src/map/HPMmap.c @@ -74,7 +74,6 @@ #include "map/mercenary.h" #include "map/mob.h" #include "map/npc.h" -#include "map/packets_struct.h" #include "map/party.h" #include "map/path.h" #include "map/pc.h" diff --git a/src/map/clif.c b/src/map/clif.c index d4c378f27..9f1038d2c 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -21971,7 +21971,7 @@ static void clif_item_preview(struct map_session_data *sd, int n) Assert_retv(n >= 0 && n < MAX_INVENTORY); struct PACKET_ZC_ITEM_PREVIEW p; - p.packetType = itemPreview; + p.packetType = HEADER_ZC_ITEM_PREVIEW; p.index = n + 2; #if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 p.isDamaged = (sd->status.inventory[n].attribute & ATTR_BROKEN) != 0 ? 1 : 0; diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h index 5d097104e..cd3a3b989 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -25,10 +25,15 @@ #include "common/cbasetypes.h" #include "common/mmo.h" +#include "common/packetsstatic_len.h" // Packet DB #define MAX_PACKET_POS 20 +#define DEFINE_PACKET_HEADER(name, id) \ + STATIC_ASSERT(sizeof(struct PACKET_##name) == PACKET_LEN_##id, "Wrong size PACKET_"#name); \ + enum { HEADER_##name = id }; + /** * **/ @@ -449,11 +454,6 @@ enum packet_headers { #else guildLeave = 0x15a, #endif -#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 - itemPreview = 0xb13, -#else - itemPreview = 0xab9, -#endif #if PACKETVER_RE_NUM >= 20181031 autoSpellList = 0xafb, #else @@ -2882,17 +2882,6 @@ struct PACKET_ZC_CAMERA_INFO { float latitude; } __attribute__((packed)); -struct PACKET_ZC_ITEM_PREVIEW { - int16 packetType; - int16 index; -#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 - int8 isDamaged; -#endif - int16 refiningLevel; - struct EQUIPSLOTINFO slot; - struct ItemOptions option_data[MAX_ITEM_OPTIONS]; -} __attribute__((packed)); - #if PACKETVER_RE_NUM >= 20181031 #define PACKET_ZC_AUTOSPELLLIST PACKET_ZC_AUTOSPELLLIST2 #else @@ -2910,6 +2899,30 @@ struct PACKET_ZC_AUTOSPELLLIST2 { int skills[]; } __attribute__((packed)); +#if PACKETVER_MAIN_NUM >= 20170726 || PACKETVER_RE_NUM >= 20170621 || defined(PACKETVER_ZERO) +#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 +struct PACKET_ZC_ITEM_PREVIEW { + int16 packetType; + int16 index; + int8 isDamaged; + int16 refiningLevel; + struct EQUIPSLOTINFO slot; + struct ItemOptions option_data[MAX_ITEM_OPTIONS]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ITEM_PREVIEW, 0x0b13); +#else // PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 + +struct PACKET_ZC_ITEM_PREVIEW { + int16 packetType; + int16 index; + int16 refiningLevel; + struct EQUIPSLOTINFO slot; + struct ItemOptions option_data[MAX_ITEM_OPTIONS]; +} __attribute__((packed)); +DEFINE_PACKET_HEADER(ZC_ITEM_PREVIEW, 0x0ab9); +#endif // PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017 || PACKETVER_ZERO_NUM >= 20181024 +#endif // PACKETVER_MAIN_NUM >= 20170726 || PACKETVER_RE_NUM >= 20170621 || defined(PACKETVER_ZERO) + #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #pragma pack(pop) #endif // not NetBSD < 6 / Solaris -- cgit v1.2.3-70-g09d2