summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/userprocess.cpp1
-rw-r--r--src/users.cpp20
2 files changed, 15 insertions, 6 deletions
diff --git a/src/userprocess.cpp b/src/userprocess.cpp
index 43edb56b1..9aa6d4a31 100644
--- a/src/userprocess.cpp
+++ b/src/userprocess.cpp
@@ -331,7 +331,6 @@ void InspIRCd::DoBackgroundUserStuff(time_t TIME)
* 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.
*/
-
curr->FlushWriteBuf();
}
}
diff --git a/src/users.cpp b/src/users.cpp
index 4bfb8955a..2f1916391 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -667,21 +667,26 @@ void userrec::FlushWriteBuf()
{
if (errno == EAGAIN)
{
+ /* The socket buffer is full. This isnt fatal,
+ * try again later.
+ */
ServerInstance->Log(DEBUG,"EAGAIN, want write");
this->ServerInstance->SE->WantWrite(this);
}
else
{
- this->QuitUser(ServerInstance, this, strerror(errno));
+ /* Fatal error, set write error and bail
+ */
+ this->SetWriteError(strerror(errno));
return;
}
}
else
{
- // advance the queue
+ /* advance the queue */
if (n_sent)
this->sendq = this->sendq.substr(n_sent);
- // update the user's stats counters
+ /* update the user's stats counters */
this->bytes_out += n_sent;
this->cmds_out++;
if (n_sent != old_sendq_length)
@@ -703,7 +708,6 @@ void userrec::SetWriteError(const std::string &error)
{
try
{
- ServerInstance->Log(DEBUG,"SetWriteError: %s",error.c_str());
// don't try to set the error twice, its already set take the first string.
if (this->WriteError.empty())
{
@@ -2031,13 +2035,14 @@ void userrec::HandleEvent(EventType et, int errornum)
{
case EVENT_READ:
ServerInstance->ProcessUser(this);
+
break;
case EVENT_WRITE:
this->FlushWriteBuf();
break;
case EVENT_ERROR:
/** This should be safe, but dont DARE do anything after it -- Brain */
- userrec::QuitUser(ServerInstance, this, errornum ? strerror(errornum) : "EOF from client");
+ this->SetWriteError(errornum ? strerror(errornum) : "EOF from client");
break;
}
}
@@ -2045,4 +2050,9 @@ void userrec::HandleEvent(EventType et, int errornum)
{
ServerInstance->Log(DEBUG,"Exception in userrec::HandleEvent intercepted");
}
+
+ /* If the user has raised an error whilst being processed, quit them now we're safe to */
+ if (!WriteError.empty())
+ userrec::QuitUser(ServerInstance, this, GetWriteError());
}
+