]> jfr.im git - irc/quakenet/newserv.git/commitdiff
trusts_policy: Fix handling socket timeouts and disconnects.
authorGunnar Beutner <redacted>
Thu, 13 Feb 2014 18:39:17 +0000 (19:39 +0100)
committerGunnar Beutner <redacted>
Thu, 13 Feb 2014 18:39:17 +0000 (19:39 +0100)
chanserv/chancmds/chanlev.c
trusts/trusts_policy.c

index 9e0d60bbffe35305af4e0de144ce3f55ae85b872..ff56b98a4ad47e88053833dce050ca88f232b403 100644 (file)
@@ -282,7 +282,7 @@ int csc_dochanlev(void *source, int cargc, char **cargv) {
         for (trcup=target->knownon;trcup;trcup=trcup->nextbyuser)
           channelcount++;
 
-        if(channelcount >= MAXCHANNELS) {
+        if(channelcount >= (!UIsNoAuthLimit(target) ? MAXCHANNELS : 5 * MAXCHANNELS)) {
           chanservstdmessage(sender, QM_TOOMANYCHANNELS);
           return CMD_ERROR;
         } 
index 663007518c67ae2ed6146179215dd031e9cbff99..cd640039064a4652f4becb2a1295c6dd66a62197 100644 (file)
@@ -243,9 +243,8 @@ static void trustfreeconnection(trustsocket *sock, int unlink) {
     return;
   }
 
-  pnext = &tslist;
-  
-  for(ts=*pnext;*pnext;pnext=&((*pnext)->next)) {
+  for(pnext=&tslist;*pnext;pnext=&((*pnext)->next)) {
+    ts=*pnext;
     if(ts == sock) {
       *pnext = sock->next;
       trustfreeconnection(sock, 0);
@@ -260,6 +259,7 @@ static int handletrustauth(trustsocket *sock, char *server_name, char *mac) {
   unsigned char digest[16];
   char noncehexbuf[NONCELEN * 2 + 1];
   char hexbuf[sizeof(digest) * 2 + 1];
+  trustsocket *ts, **pnext;
 
   for(i=0;i<MAXSERVERS;i++) {
     if(trustaccounts[i].used && strcmp(trustaccounts[i].server, server_name) == 0) {
@@ -282,6 +282,16 @@ static int handletrustauth(trustsocket *sock, char *server_name, char *mac) {
     return trustkillconnection(sock, "Bad MAC.");
   }
 
+  for(pnext=&tslist;*pnext;pnext=&((*pnext)->next)) {
+    ts = *pnext;
+    if(ts->authed && strcmp(ts->authuser, server_name) == 0) {
+      trustkillconnection(ts, "New connection with same server name.");
+      *pnext = ts->next;
+      trustfreeconnection(ts, 0);
+      break;
+    }
+  }
+
   sock->authed = 1;
   strncpy(sock->authuser, server_name, SERVERLEN);
 
@@ -394,9 +404,8 @@ static void trustdotimeout(void *arg) {
   time_t t = time(NULL);
   trustsocket **pnext, *sock;
 
-  pnext = &tslist;
-    
-  for(sock=*pnext;*pnext;pnext=&((*pnext)->next)) {
+  for(pnext=&tslist;*pnext;pnext=&((*pnext)->next)) {
+    sock = *pnext;
     if(!sock->authed && t >= sock->timeout) {
       trustkillconnection(sock, "Auth timeout.");
       *pnext = sock->next;