X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Finspircd.cpp;h=2558f3efc57a6c40d828adcb7a087318b0c5969e;hb=483ec8439c6564f8e3783223a01c641326b6f2d8;hp=4a5b3cba375c8814ba5ae929b267dea0577e9655;hpb=2470212ed18754d540a47198c4be320d63c44fd3;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 4a5b3cba3..2558f3efc 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -850,6 +850,12 @@ void WriteCommon(userrec *u, char* text, ...) } } } + // if the user was not in any channels, no users will receive the text. Make sure the user + // receives their OWN message for WriteCommon + if (!already_sent.size()) + { + WriteFrom(u->fd,u,"%s",textbuffer); + } } /* write a formatted string to all users who share at least one common @@ -2689,7 +2695,7 @@ std::string GetVersionString() v2 = strtok_r(s1," ",&savept); s1 = savept; snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s (O=%lu)",VERSION,v2,ServerName,SYSTEM,(unsigned long)OPTIMISATION); - + return versiondata; } void handle_version(char **parameters, int pcnt, userrec *user) @@ -3857,7 +3863,7 @@ int InspIRCd(void) tvs.tv_sec = 0; tv.tv_sec = 0; tv.tv_usec = 10000L; - char data[10240]; + char data[65535]; timeval tval; fd_set sfd; tval.tv_usec = 10000L; @@ -4059,9 +4065,7 @@ int InspIRCd(void) result = EAGAIN; if ((count2a->second->fd != FD_MAGIC_NUMBER) && (count2a->second->fd != -1) && (FD_ISSET (count2a->second->fd, &sfd))) { - memset(data, 0, 10240); - result = read(count2a->second->fd, data, 10240); - + result = read(count2a->second->fd, data, 65535); if (result) { // perform a check on the raw buffer as an array (not a string!) to remove @@ -4072,40 +4076,67 @@ int InspIRCd(void) if ((data[checker] == 0) || (data[checker] == 7)) data[checker] = ' '; } + if (result > 0) + data[result] = '\0'; userrec* current = count2a->second; int currfd = current->fd; - char* l = strtok(data,"\n"); int floodlines = 0; - while (l) + current->AddBuffer(data); + if (current->recvq.length() > NetBufferSize) + { + if (current->registered == 7) + { + kill_link(current,"RecvQ exceeded"); + } + else + { + WriteOpers("*** Excess flood from %s",current->ip); + log(DEFAULT,"Excess flood from: %s",current->ip); + add_zline(120,ServerName,"Flood from unregistered connection",current->ip); + apply_lines(); + } + goto label; + } + // while there are complete lines to process... + while (current->BufferIsReady()) { floodlines++; - if ((floodlines > current->flood) && (current->flood != 0)) + if (TIME > current->reset_due) + { + current->reset_due = TIME+3; + current->lines_in = 0; + } + current->lines_in++; + if (current->lines_in > current->flood) { - log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); - WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); + log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); + WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); kill_link(current,"Excess flood"); - goto label; } - char sanitized[NetBufferSize]; - memset(sanitized, 0, NetBufferSize); - int ptt = 0; - for (int pt = 0; pt < strlen(l); pt++) + if ((floodlines > current->flood) && (current->flood != 0)) { - if (l[pt] != '\r') + if (current->registered == 7) { - sanitized[ptt++] = l[pt]; + log(DEFAULT,"Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); + WriteOpers("*** Excess flood from: %s!%s@%s",current->nick,current->ident,current->host); + kill_link(current,"Excess flood"); } + else + { + add_zline(120,ServerName,"Flood from unregistered connection",current->ip); + apply_lines(); + } + goto label; } - sanitized[ptt] = '\0'; + char sanitized[MAXBUF]; + // use GetBuffer to copy single lines into the sanitized string + strlcpy(sanitized,current->GetBuffer().c_str(),MAXBUF); if (*sanitized) { - - // we're gonna re-scan to check if the nick is gone, after every // command - if it has, we're gonna bail bool find_again = false; process_buffer(sanitized,current); - // look for the user's record in case it's changed for (user_hash::iterator c2 = clientlist.begin(); c2 != clientlist.end(); c2++) { @@ -4121,7 +4152,6 @@ int InspIRCd(void) goto label; } - l = strtok(NULL,"\n"); } goto label; }