From 42e660e2a2f6642141a138760bbfefd78a6fb501 Mon Sep 17 00:00:00 2001 From: Nay Date: Mon, 11 Feb 2013 02:59:07 +0000 Subject: Core/Sockets: Always try to send MSG_NOSIGNAL in peer().send() Fixes RASocket::authenticate crash "MSG_NOSIGNAL: If you send() to a remote host which is no longer recv()ing, you'll typically get the signal SIGPIPE. Adding this flag prevents that signal from being raised." Closes #5040 Thanks to @derex for the hint --- src/server/authserver/Server/RealmSocket.cpp | 4 ++++ src/server/game/Server/WorldSocket.cpp | 4 ++-- src/server/worldserver/RemoteAccess/RASocket.cpp | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/server/authserver/Server/RealmSocket.cpp b/src/server/authserver/Server/RealmSocket.cpp index e67af783d5f..2e64321d8a1 100644 --- a/src/server/authserver/Server/RealmSocket.cpp +++ b/src/server/authserver/Server/RealmSocket.cpp @@ -138,7 +138,11 @@ ssize_t RealmSocket::noblk_send(ACE_Message_Block &message_block) return -1; // Try to send the message directly. +#ifdef MSG_NOSIGNAL ssize_t n = peer().send(message_block.rd_ptr(), len, MSG_NOSIGNAL); +#else + ssize_t n = peer().send(message_block.rd_ptr(), len); +#endif // MSG_NOSIGNAL if (n < 0) { diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index b2534bfbb0c..de5dd1dd98b 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -372,9 +372,9 @@ int WorldSocket::handle_output_queue (GuardType& g) const size_t send_len = mblk->length(); #ifdef MSG_NOSIGNAL - ssize_t n = peer().send (mblk->rd_ptr(), send_len, MSG_NOSIGNAL); + ssize_t n = peer().send(mblk->rd_ptr(), send_len, MSG_NOSIGNAL); #else - ssize_t n = peer().send (mblk->rd_ptr(), send_len); + ssize_t n = peer().send(mblk->rd_ptr(), send_len); #endif // MSG_NOSIGNAL if (n == 0) diff --git a/src/server/worldserver/RemoteAccess/RASocket.cpp b/src/server/worldserver/RemoteAccess/RASocket.cpp index b939f267233..ee05e83ad4d 100644 --- a/src/server/worldserver/RemoteAccess/RASocket.cpp +++ b/src/server/worldserver/RemoteAccess/RASocket.cpp @@ -336,7 +336,12 @@ int RASocket::subnegotiate() //! Just send back end of subnegotiation packet uint8 const reply[2] = {0xFF, 0xF0}; + +#ifdef MSG_NOSIGNAL + return int(peer().send(reply, 2, MSG_NOSIGNAL)); +#else return int(peer().send(reply, 2)); +#endif // MSG_NOSIGNAL } int RASocket::svc(void) -- cgit v1.2.3