fix(Core/Server): Add bytebuffer exception handling to addoninfo read (#21500)
This commit is contained in:
@@ -1147,57 +1147,64 @@ void WorldSession::ReadAddonsInfo(ByteBuffer& data)
|
|||||||
|
|
||||||
if (uncompress(addonInfo.contents(), &uSize, data.contents() + pos, data.size() - pos) == Z_OK)
|
if (uncompress(addonInfo.contents(), &uSize, data.contents() + pos, data.size() - pos) == Z_OK)
|
||||||
{
|
{
|
||||||
uint32 addonsCount;
|
try
|
||||||
addonInfo >> addonsCount; // addons count
|
|
||||||
|
|
||||||
for (uint32 i = 0; i < addonsCount; ++i)
|
|
||||||
{
|
{
|
||||||
std::string addonName;
|
uint32 addonsCount;
|
||||||
uint8 enabled;
|
addonInfo >> addonsCount; // addons count
|
||||||
uint32 crc, unk1;
|
|
||||||
|
|
||||||
// check next addon data format correctness
|
for (uint32 i = 0; i < addonsCount; ++i)
|
||||||
if (addonInfo.rpos() + 1 > addonInfo.size())
|
|
||||||
return;
|
|
||||||
|
|
||||||
addonInfo >> addonName;
|
|
||||||
|
|
||||||
addonInfo >> enabled >> crc >> unk1;
|
|
||||||
|
|
||||||
LOG_DEBUG("network", "ADDON: Name: {}, Enabled: 0x{:x}, CRC: 0x{:x}, Unknown2: 0x{:x}", addonName, enabled, crc, unk1);
|
|
||||||
|
|
||||||
AddonInfo addon(addonName, enabled, crc, 2, true);
|
|
||||||
|
|
||||||
SavedAddon const* savedAddon = AddonMgr::GetAddonInfo(addonName);
|
|
||||||
if (savedAddon)
|
|
||||||
{
|
{
|
||||||
bool match = true;
|
std::string addonName;
|
||||||
|
uint8 enabled;
|
||||||
|
uint32 crc, unk1;
|
||||||
|
|
||||||
if (addon.CRC != savedAddon->CRC)
|
// check next addon data format correctness
|
||||||
match = false;
|
if (addonInfo.rpos() + 1 > addonInfo.size())
|
||||||
|
return;
|
||||||
|
|
||||||
if (!match)
|
addonInfo >> addonName;
|
||||||
LOG_DEBUG("network", "ADDON: {} was known, but didn't match known CRC (0x{:x})!", addon.Name, savedAddon->CRC);
|
|
||||||
|
addonInfo >> enabled >> crc >> unk1;
|
||||||
|
|
||||||
|
LOG_DEBUG("network", "ADDON: Name: {}, Enabled: 0x{:x}, CRC: 0x{:x}, Unknown2: 0x{:x}", addonName, enabled, crc, unk1);
|
||||||
|
|
||||||
|
AddonInfo addon(addonName, enabled, crc, 2, true);
|
||||||
|
|
||||||
|
SavedAddon const* savedAddon = AddonMgr::GetAddonInfo(addonName);
|
||||||
|
if (savedAddon)
|
||||||
|
{
|
||||||
|
bool match = true;
|
||||||
|
|
||||||
|
if (addon.CRC != savedAddon->CRC)
|
||||||
|
match = false;
|
||||||
|
|
||||||
|
if (!match)
|
||||||
|
LOG_DEBUG("network", "ADDON: {} was known, but didn't match known CRC (0x{:x})!", addon.Name, savedAddon->CRC);
|
||||||
|
else
|
||||||
|
LOG_DEBUG("network", "ADDON: {} was known, CRC is correct (0x{:x})", addon.Name, savedAddon->CRC);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
LOG_DEBUG("network", "ADDON: {} was known, CRC is correct (0x{:x})", addon.Name, savedAddon->CRC);
|
{
|
||||||
}
|
AddonMgr::SaveAddon(addon);
|
||||||
else
|
|
||||||
{
|
|
||||||
AddonMgr::SaveAddon(addon);
|
|
||||||
|
|
||||||
LOG_DEBUG("network", "ADDON: {} (0x{:x}) was not known, saving...", addon.Name, addon.CRC);
|
LOG_DEBUG("network", "ADDON: {} (0x{:x}) was not known, saving...", addon.Name, addon.CRC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @todo: Find out when to not use CRC/pubkey, and other possible states.
|
||||||
|
m_addonsList.push_back(addon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @todo: Find out when to not use CRC/pubkey, and other possible states.
|
uint32 currentTime;
|
||||||
m_addonsList.push_back(addon);
|
addonInfo >> currentTime;
|
||||||
|
LOG_DEBUG("network", "ADDON: CurrentTime: {}", currentTime);
|
||||||
|
|
||||||
|
if (addonInfo.rpos() != addonInfo.size())
|
||||||
|
LOG_DEBUG("network", "packet under-read!");
|
||||||
|
}
|
||||||
|
catch (ByteBufferException const& e)
|
||||||
|
{
|
||||||
|
LOG_ERROR("network", "Addon packet read error! {}", e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 currentTime;
|
|
||||||
addonInfo >> currentTime;
|
|
||||||
LOG_DEBUG("network", "ADDON: CurrentTime: {}", currentTime);
|
|
||||||
|
|
||||||
if (addonInfo.rpos() != addonInfo.size())
|
|
||||||
LOG_DEBUG("network", "packet under-read!");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LOG_ERROR("network", "Addon packet uncompress error!");
|
LOG_ERROR("network", "Addon packet uncompress error!");
|
||||||
|
|||||||
Reference in New Issue
Block a user