summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-20 16:08:00 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-20 16:08:00 +0000
commit5e0d86bc0ea085f6979904cc5371ad8b97674e41 (patch)
treead1899eadb033785aaab5d7e85d6f512106e601c
parent9fbcea26f14efd6587e94ec72e1c6d4bcf060b41 (diff)
Extra sanity checks
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4457 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/userprocess.cpp89
1 files changed, 48 insertions, 41 deletions
diff --git a/src/userprocess.cpp b/src/userprocess.cpp
index 7ea5167a5..a6f86d2f2 100644
--- a/src/userprocess.cpp
+++ b/src/userprocess.cpp
@@ -334,58 +334,65 @@ void DoBackgroundUserStuff(time_t TIME)
{
cfd = curr->fd;
- /*
- * registration timeout -- didnt send USER/NICK/HOST
- * in the time specified in their connection class.
- */
- if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7))
- {
- log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick);
- ZapThisDns(curr->fd);
- GlobalGoners.AddItem(curr,"Registration timeout");
- continue;
- }
-
- /*
- * user has signed on with USER/NICK/PASS, and dns has completed, all the modules
- * say this user is ok to proceed, fully connect them.
- */
- if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr)))
- {
- curr->dns_done = true;
- ZapThisDns(curr->fd);
- ServerInstance->stats->statsDnsBad++;
- FullConnectUser(curr,&GlobalGoners);
- continue;
- }
-
- if ((curr->dns_done) && (curr->registered == 3) && (AllModulesReportReady(curr)))
- {
- log(DEBUG,"dns done, registered=3, and modules ready, OK");
- FullConnectUser(curr,&GlobalGoners);
- ZapThisDns(curr->fd);
- continue;
- }
-
- // It's time to PING this user. Send them a ping.
- if ((TIME > curr->nping) && (curr->registered == 7))
+ if ((cfd > 0) && (cfd < MAX_DESCRIPTORS) && (fd_ref_table[cfd] == curr) && (curr))
{
- // This user didn't answer the last ping, remove them
- if (!curr->lastping)
+ /*
+ * registration timeout -- didnt send USER/NICK/HOST
+ * in the time specified in their connection class.
+ */
+ if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7))
{
- GlobalGoners.AddItem(curr,"Ping timeout");
+ log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick);
+ ZapThisDns(curr->fd);
+ GlobalGoners.AddItem(curr,"Registration timeout");
continue;
}
- Write(curr->fd,"PING :%s",Config->ServerName);
- curr->lastping = 0;
- curr->nping = TIME+curr->pingmax;
+ /*
+ * user has signed on with USER/NICK/PASS, and dns has completed, all the modules
+ * say this user is ok to proceed, fully connect them.
+ */
+ if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr)))
+ {
+ curr->dns_done = true;
+ ZapThisDns(curr->fd);
+ ServerInstance->stats->statsDnsBad++;
+ FullConnectUser(curr,&GlobalGoners);
+ continue;
+ }
+
+ if ((curr->dns_done) && (curr->registered == 3) && (AllModulesReportReady(curr)))
+ {
+ log(DEBUG,"dns done, registered=3, and modules ready, OK");
+ FullConnectUser(curr,&GlobalGoners);
+ ZapThisDns(curr->fd);
+ continue;
+ }
+
+ // It's time to PING this user. Send them a ping.
+ if ((TIME > curr->nping) && (curr->registered == 7))
+ {
+ // This user didn't answer the last ping, remove them
+ if (!curr->lastping)
+ {
+ GlobalGoners.AddItem(curr,"Ping timeout");
+ curr->lastping = 1;
+ curr->nping = TIME+curr->pingmax;
+ continue;
+ }
+
+ Write(curr->fd,"PING :%s",Config->ServerName);
+ curr->lastping = 0;
+ curr->nping = TIME+curr->pingmax;
+ }
}
/*
* We can flush the write buffer as the last thing we do, because if they
* match any of the above conditions its no use flushing their buffer anyway.
*/
+
+ /* Check again that theyre still here (something above may have changed that) */
if ((cfd > 0) && (cfd < MAX_DESCRIPTORS) && (fd_ref_table[cfd] == curr) && (curr))
{
curr->FlushWriteBuf();