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