[6898] Prevent processing incoming packates for closed connection.

This commit is contained in:
VladimirMangos 2008-12-12 01:46:00 +03:00
parent ac2748a141
commit d386a67d27
3 changed files with 15 additions and 18 deletions

View file

@ -153,20 +153,11 @@ void WorldSession::logUnexpectedOpcode(WorldPacket* packet, const char *reason)
/// Update the WorldSession (triggered by World update) /// Update the WorldSession (triggered by World update)
bool WorldSession::Update(uint32 /*diff*/) bool WorldSession::Update(uint32 /*diff*/)
{ {
if (m_Socket && m_Socket->IsClosed ())
{
m_Socket->RemoveReference ();
m_Socket = NULL;
}
WorldPacket *packet;
///- Retrieve packets from the receive queue and call the appropriate handlers ///- Retrieve packets from the receive queue and call the appropriate handlers
/// \todo Is there a way to consolidate the OpcondeHandlerTable and the g_worldOpcodeNames to only maintain 1 list? /// not proccess packets if socket already closed
/// answer : there is a way, but this is better, because it would use redundant RAM while (!_recvQueue.empty() && m_Socket && !m_Socket->IsClosed ())
while (!_recvQueue.empty())
{ {
packet = _recvQueue.next(); WorldPacket *packet = _recvQueue.next();
/*#if 1 /*#if 1
sLog.outError( "MOEP: %s (0x%.4X)", sLog.outError( "MOEP: %s (0x%.4X)",
@ -226,6 +217,13 @@ bool WorldSession::Update(uint32 /*diff*/)
delete packet; delete packet;
} }
///- Cleanup socket pointer if need
if (m_Socket && m_Socket->IsClosed ())
{
m_Socket->RemoveReference ();
m_Socket = NULL;
}
///- If necessary, log the player out ///- If necessary, log the player out
time_t currTime = time(NULL); time_t currTime = time(NULL);
if (!m_Socket || (ShouldLogOut(currTime) && !m_playerLoading)) if (!m_Socket || (ShouldLogOut(currTime) && !m_playerLoading))

View file

@ -112,10 +112,9 @@ void WorldSocket::CloseSocket (void)
ACE_GUARD (LockType, Guard, m_OutBufferLock); ACE_GUARD (LockType, Guard, m_OutBufferLock);
if (closing_) if (closing_)
return; return;
closing_ = true; closing_ = true;
peer ().close_writer (); peer ().close_writer ();
} }
@ -261,7 +260,7 @@ int WorldSocket::handle_input (ACE_HANDLE)
if ((errno == EWOULDBLOCK) || if ((errno == EWOULDBLOCK) ||
(errno == EAGAIN)) (errno == EAGAIN))
{ {
return Update (); // interesting line ,isn't it ? return Update (); // interesting line ,isn't it ?
} }
DEBUG_LOG ("WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno)); DEBUG_LOG ("WorldSocket::handle_input: Peer error closing connection errno = %s", ACE_OS::strerror (errno));
@ -279,7 +278,7 @@ int WorldSocket::handle_input (ACE_HANDLE)
case 1: case 1:
return 1; return 1;
default: default:
return Update (); // another interesting line ;) return Update (); // another interesting line ;)
} }
ACE_NOTREACHED(return -1); ACE_NOTREACHED(return -1);
@ -473,7 +472,7 @@ int WorldSocket::handle_input_missing_data (void)
return -1; return -1;
} }
// We just received nice new header // We just received nice new header
if (handle_input_header () == -1) if (handle_input_header () == -1)
{ {
ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN)); ACE_ASSERT ((errno != EWOULDBLOCK) && (errno != EAGAIN));

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "6897" #define REVISION_NR "6898"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__