From 3cb06cc4ccb521e98ba43a223dd896e019b3b9b6 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Wed, 25 Mar 2009 19:30:36 +0000 Subject: * Changed a recursive BeginRobustReceive loop to a flat while loop to avoid lethal stack overflows. --- .../Region/ClientStack/LindenUDP/LLUDPServer.cs | 71 ++++++++++------------ 1 file changed, 33 insertions(+), 38 deletions(-) (limited to 'OpenSim/Region/ClientStack/LindenUDP') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index e29ec4e..3b9d293 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -291,47 +291,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// private void BeginRobustReceive() { - try - { - BeginReceive(); - } - catch (SocketException e) - { - // ENDLESS LOOP ON PURPOSE! - // Reset connection and get next UDP packet off the buffer - // If the UDP packet is part of the same stream, this will happen several hundreds of times before - // the next set of UDP data is for a valid client. - ResetServerEndPoint(e); - } - catch (ObjectDisposedException) - { - m_log.Info("[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator."); - } - } + bool done = false; - /// - /// Reset the server endpoint - /// - /// - /// The exception that has triggered the reset. Can be null if there was no exception. - /// - private void ResetServerEndPoint(Exception e) - { - try + while (!done) { - CloseCircuit(e); - } - catch (Exception e2) - { - m_log.ErrorFormat( - "[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender, e2); - } + try + { + BeginReceive(); + done = true; + } + catch (SocketException e) + { + // ENDLESS LOOP ON PURPOSE! + // Reset connection and get next UDP packet off the buffer + // If the UDP packet is part of the same stream, this will happen several hundreds of times before + // the next set of UDP data is for a valid client. - // ENDLESS LOOP ON PURPOSE! - // We need to purge the UDP stream of crap from the client that disconnected nastily or the UDP server will die - // The only way to do that is to BeginRobustReceive again! - BeginRobustReceive(); - } + try + { + CloseCircuit(e); + } + catch (Exception e2) + { + m_log.ErrorFormat( + "[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender, + e2); + } + } + catch (ObjectDisposedException) + { + m_log.Info( + "[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator."); + + done = true; + } + } + } /// /// Close a client circuit. This is done in response to an exception on receive, and should not be called -- cgit v1.1