(svn r10555) -Codechange/Fix: add a soft limit of 4096 "entities" in a station's waiting queue and a hard limit of 32768 so (malicious) people cannot cause a "denial of service" attack by filling cargo lists.
authorrubidium
Fri, 13 Jul 2007 20:46:53 +0000
changeset 7748 5f945356a9cd
parent 7747 71faad59535b
child 7749 dc363011d4bd
(svn r10555) -Codechange/Fix: add a soft limit of 4096 "entities" in a station's waiting queue and a hard limit of 32768 so (malicious) people cannot cause a "denial of service" attack by filling cargo lists.
src/station_cmd.cpp
--- a/src/station_cmd.cpp	Fri Jul 13 19:06:12 2007 +0000
+++ b/src/station_cmd.cpp	Fri Jul 13 20:46:53 2007 +0000
@@ -2411,6 +2411,21 @@
 					}
 				}
 
+				/* At some point we really must cap the cargo. Previously this
+				 * was a strict 4095, but now we'll have a less strict, but
+				 * increasingly agressive truncation of the amount of cargo. */
+				static const uint WAITING_CARGO_THRESHOLD  = 1 << 12;
+				static const uint WAITING_CARGO_CUT_FACTOR = 1 <<  6;
+				static const uint MAX_WAITING_CARGO        = 1 << 15;
+
+				if (waiting > WAITING_CARGO_THRESHOLD) {
+					uint difference = waiting - WAITING_CARGO_THRESHOLD;
+					waiting -= (difference / WAITING_CARGO_CUT_FACTOR);
+
+					waiting = min(waiting, MAX_WAITING_CARGO);
+					waiting_changed = true;
+				}
+
 				if (waiting_changed) ge->cargo.Truncate(waiting);
 			}
 		}