diff --git a/src/framework/Utilities/ByteConverter.h b/src/framework/Utilities/ByteConverter.h index f5cfa5998..199edcb6c 100644 --- a/src/framework/Utilities/ByteConverter.h +++ b/src/framework/Utilities/ByteConverter.h @@ -46,12 +46,18 @@ namespace ByteConverter #if MANGOS_ENDIAN == MANGOS_BIGENDIAN template inline void EndianConvert(T& val) { ByteConverter::apply(&val); } +template inline void EndianConvertReverse(T&) { } #else template inline void EndianConvert(T&) { } +template inline void EndianConvertReverse(T& val) { ByteConverter::apply(&val); } #endif -template inline void EndianConvert(T*) { } +template void EndianConvert(T*); // will generate link error +template void EndianConvertReverse(T*); // will generate link error + inline void EndianConvert(uint8&) { } inline void EndianConvert( int8&) { } +inline void EndianConvertReverse(uint8&) { } +inline void EndianConvertReverse( int8&) { } #endif diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index 692b1a48e..fdf1d5ed5 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -377,21 +377,14 @@ int WorldSocket::handle_input_header (void) ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ()); - header.size = ACE_NTOHS (header.size); + EndianConvertReverse(header.size); + EndianConvert(header.cmd); -#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN - header.cmd = ACE_SWAP_LONG (header.cmd) -#endif // ACE_BIG_ENDIAN - - if ((header.size < 4) || - (header.size > 10240) || - (header.cmd < 0) || - (header.cmd > 10240) - ) + if ((header.size < 4) || (header.size > 10240) || + (header.cmd < 0) || (header.cmd > 10240) ) { sLog.outError ("WorldSocket::handle_input_header: client sent mailformed packet size = %d , cmd = %d", - header.size, - header.cmd); + header.size, header.cmd); errno = EINVAL; return -1; @@ -664,7 +657,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) } // Read the content of the packet - recvPacket >> BuiltNumberClient; // for now no use + recvPacket >> BuiltNumberClient; // for now no use recvPacket >> unk2; recvPacket >> account; @@ -974,13 +967,10 @@ int WorldSocket::iSendPacket (const WorldPacket& pct) ServerPktHeader header; header.cmd = pct.GetOpcode (); - -#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN - header.cmd = ACE_SWAP_WORD (header.cmd) -#endif + EndianConvert(header.cmd); header.size = (uint16) pct.size () + 2; - header.size = ACE_HTONS (header.size); + EndianConvertReverse(header.size); m_Crypt.EncryptSend ((uint8*) & header, sizeof (header)); diff --git a/src/shared/WorldPacket.h b/src/shared/WorldPacket.h index 373ab02ed..7e8029c21 100644 --- a/src/shared/WorldPacket.h +++ b/src/shared/WorldPacket.h @@ -22,6 +22,8 @@ #include "Common.h" #include "ByteBuffer.h" +// Note: m_opcode and size stored in platfom dependent format +// ignore endianess until send, and converted at receive class WorldPacket : public ByteBuffer { public: