summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-04-26 17:55:41 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-04-26 17:55:41 +0800
commit694b43eb6c593a2373cda94dd79c12c4ec16d2d1 (patch)
treeef3dac265a8d6b28298699231633a879fa516dc2
parent4944da34555c3aebce8258cb81955275e0bb8acc (diff)
downloadpttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar.gz
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar.bz2
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar.lz
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar.xz
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.tar.zst
pttbbs-694b43eb6c593a2373cda94dd79c12c4ec16d2d1.zip
* add boundary check when ack queue grows too high, in order to prevent buffer full on tunnel
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5039 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--pttbbs/daemon/logind/logind.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/pttbbs/daemon/logind/logind.c b/pttbbs/daemon/logind/logind.c
index a93f0f2b..3f9cd995 100644
--- a/pttbbs/daemon/logind/logind.c
+++ b/pttbbs/daemon/logind/logind.c
@@ -44,6 +44,10 @@
#define LOGIND_MAX_FDS (100000)
#endif
+#ifndef LOGIND_ACKQUEUE_BOUND
+#define LOGIND_ACKQUEUE_BOUND (255)
+#endif
+
#define MY_EVENT_PRIORITY_NUMBERS (4)
#define EVTPRIORITY_NORM (MY_EVENT_PRIORITY_NUMBERS/2)
#define EVTPRIORITY_ACK (EVTPRIORITY_NORM-1)
@@ -365,6 +369,12 @@ ackq_gc()
g_ack_queue.reuse = g_ack_queue.size = 0;
}
+static ssize_t
+ackq_size()
+{
+ return g_ack_queue.size - g_ack_queue.reuse;
+}
+
static void
ackq_add(login_conn_ctx *ctx)
{
@@ -1275,7 +1285,8 @@ auth_start(int fd, login_conn_ctx *conn)
draw_auth_success(conn, isfree);
- if (!start_service(fd, conn))
+ if (ackq_size() > LOGIND_ACKQUEUE_BOUND ||
+ !start_service(fd, conn))
{
// too bad, we can't start service.
retry_service();