forked from metin2/server
Fixed serious issue where oversized packets would be split apart by libevent without proper handling by the db core. Removed Google Sanitizers
This commit is contained in:
parent
b5ea548038
commit
972530f3a7
@ -26,6 +26,3 @@ find_package(Libevent CONFIG REQUIRED)
|
|||||||
target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
|
target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)
|
target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)
|
||||||
|
|
||||||
# Memory debugging
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g")
|
|
||||||
|
@ -63,12 +63,19 @@ void CPeer::SetUserCount(DWORD dwCount)
|
|||||||
|
|
||||||
bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWORD & dwLength, const char ** data)
|
bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWORD & dwLength, const char ** data)
|
||||||
{
|
{
|
||||||
|
// Return if not enough data was received to read the header
|
||||||
if (GetRecvLength() < iBytesProceed + 9)
|
if (GetRecvLength() < iBytesProceed + 9)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const char * buf = (const char *) GetRecvBuffer(iBytesProceed + 9);
|
const char * buf = (const char *) GetRecvBuffer(iBytesProceed + 9);
|
||||||
|
if (!buf) {
|
||||||
|
sys_err("PeekPacket: Failed to get network buffer!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
buf += iBytesProceed;
|
buf += iBytesProceed;
|
||||||
|
|
||||||
|
// Read the header data
|
||||||
header = *(buf++);
|
header = *(buf++);
|
||||||
|
|
||||||
dwHandle = *((DWORD *) buf);
|
dwHandle = *((DWORD *) buf);
|
||||||
@ -77,7 +84,7 @@ bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWO
|
|||||||
dwLength = *((DWORD *) buf);
|
dwLength = *((DWORD *) buf);
|
||||||
buf += sizeof(DWORD);
|
buf += sizeof(DWORD);
|
||||||
|
|
||||||
//sys_log(0, "%d header %d handle %u length %u", GetRecvLength(), header, dwHandle, dwLength);
|
// Ensure that all the data was fully received
|
||||||
if (iBytesProceed + dwLength + 9 > (DWORD) GetRecvLength())
|
if (iBytesProceed + dwLength + 9 > (DWORD) GetRecvLength())
|
||||||
{
|
{
|
||||||
sys_log(0, "PeekPacket: not enough buffer size: len %u, recv %d",
|
sys_log(0, "PeekPacket: not enough buffer size: len %u, recv %d",
|
||||||
@ -85,6 +92,17 @@ bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWO
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that all the required data is available in a contiguous area
|
||||||
|
buf = (const char *) GetRecvBuffer(iBytesProceed + dwLength + 9);
|
||||||
|
if (!buf) {
|
||||||
|
sys_err("PeekPacket: Failed to get network buffer!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip the header
|
||||||
|
buf += iBytesProceed + 9;
|
||||||
|
|
||||||
|
// Set the data pointer
|
||||||
*data = buf;
|
*data = buf;
|
||||||
iBytesProceed += dwLength + 9;
|
iBytesProceed += dwLength + 9;
|
||||||
return true;
|
return true;
|
||||||
|
@ -49,4 +49,3 @@ find_package (Threads REQUIRED)
|
|||||||
target_link_libraries (${PROJECT_NAME} Threads::Threads)
|
target_link_libraries (${PROJECT_NAME} Threads::Threads)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} libgame libpoly libsql libthecore liblua)
|
target_link_libraries(${PROJECT_NAME} libgame libpoly libsql libthecore liblua)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user