X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=3be7d59452ebafb1f2f5b1295d7dd28d93e98f19;hb=0d2b6637ca369166629576f160ef1fd376078e5a;hp=493bba8c9a9baf6de395eb2590c4cea2d9b871d0;hpb=f3c3546d5492a62f17ec7d5c5424524fc7406a09;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index 493bba8c9..3be7d5945 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -457,15 +457,33 @@ bool InitConnect(ServerConfig* conf, const char*) { conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Reading connect classes... class list is:"); - /* - * Remove all connect classes.. we'll reset the pointers in user classes - * once all new classes have been read from config. - */ - while (conf->Classes.begin() != conf->Classes.end()) + for (ClassVector::iterator i = conf->Classes.begin(); i != conf->Classes.end() ; ) { - ConnectClass *c = *(conf->Classes.begin()); - conf->Classes.erase(conf->Classes.begin()); - delete c; + ConnectClass* c = *i; + + /* + * only delete a class with refcount 0. + * this is needed to avoid trampling on a wild pointer (User::MyClass)! + * it's also the most simple way to do it, given that we're looking at threads.. + * -- w00t + */ + if (c->RefCount == 0) + { + conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Removing connect class, refcount is 0!"); + + /* This was causing a crash, because we'd set i to .begin() just here, but then the for loop's increment would + * set it to .begin() + 1. Which if it was already the last thing in the list, wasn't good. + * Now the increment is in the else { } below. + */ + conf->Classes.erase(i); + i = conf->Classes.begin(); // start over so we don't trample on a bad iterator + } + else + { + /* also mark all existing classes disabled, if they still exist in the conf, they will be reenabled. */ + c->SetDisabled(true); + i++; + } } return true; @@ -526,7 +544,7 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) /* Find existing class by mask, the mask should be unique */ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item) { - if ((*item)->GetHost() == allow) + if ((*item)->GetHost() == allow && !(*item)->GetDisabled()) { (*item)->Update(timeout, flood, allow, pingfreq, password, threshold, sendq, recvq, localmax, globalmax, maxchans, port, limit); return true; @@ -542,7 +560,7 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) /* Find existing class by mask, the mask should be unique */ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item) { - if ((*item)->GetHost() == deny) + if ((*item)->GetHost() == deny && !(*item)->GetDisabled()) { (*item)->Update(name, deny); (*item)->SetPort(port); @@ -562,29 +580,6 @@ bool DoConnect(ServerConfig* conf, const char*, char**, ValueList &values, int*) */ bool DoneConnect(ServerConfig *conf, const char*) { - /* - * Update connect classes on all users. - */ - conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Resetting connect classes for users..."); - for (std::vector::iterator n = conf->GetInstance()->Users->local_users.begin(); n != conf->GetInstance()->Users->local_users.end(); n++) - { - User *u = *n; - - /* - * Make their existing class go away so that SetClass doesn't touch a wild ptr, important! - */ - u->MyClass = NULL; - - u->SetClass(); - - /* - * Check that the user falls into a valid class block.. if they don't, - * they need to be quit, which CheckClass will do. -- w00t - */ - u->CheckClass(); - } - - conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Done adding connect classes!"); return true; } @@ -747,7 +742,8 @@ void ServerConfig::Read(bool bail, const std::string &useruid) static char announceinvites[MAXBUF]; /* options:announceinvites setting */ static char disabledumodes[MAXBUF]; /* Disabled usermodes */ static char disabledcmodes[MAXBUF]; /* Disabled chanmodes */ - errstr.clear(); + /* std::ostringstream::clear() does not clear the string itself, only the error flags. */ + this->errstr = new std::ostringstream(std::stringstream::in | std::stringstream::out); include_stack.clear(); @@ -820,6 +816,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"security", "hidewhois", "", new ValueContainerChar (this->HideWhoisServer), DT_NOSPACES, NoValidation}, {"security", "hidekills", "", new ValueContainerChar (this->HideKillsServer), DT_NOSPACES, NoValidation}, {"security", "operspywhois", "0", new ValueContainerBool (&this->OperSpyWhois), DT_BOOLEAN, NoValidation}, + {"security", "restrictbannedusers", "1", new ValueContainerBool (&this->RestrictBannedUsers), DT_BOOLEAN, NoValidation}, {"performance", "nouserdns", "0", new ValueContainerBool (&this->NoUserDns), DT_BOOLEAN, NoValidation}, {"options", "syntaxhints", "0", new ValueContainerBool (&this->SyntaxHints), DT_BOOLEAN, NoValidation}, {"options", "cyclehosts", "0", new ValueContainerBool (&this->CycleHosts), DT_BOOLEAN, NoValidation}, @@ -940,11 +937,14 @@ void ServerConfig::Read(bool bail, const std::string &useruid) /* Make a copy here so if it fails then we can carry on running with an unaffected config */ newconfig.clear(); - if (!this->DoInclude(newconfig, ServerInstance->ConfigFileName, errstr)) + if (!this->DoInclude(newconfig, ServerInstance->ConfigFileName, *errstr)) { - ReportConfigError(errstr.str(), bail, useruid); + ReportConfigError(errstr->str(), bail, useruid); + delete errstr; return; } + + delete errstr; /* The stuff in here may throw CoreException, be sure we're in a position to catch it. */ try @@ -978,7 +978,10 @@ void ServerConfig::Read(bool bail, const std::string &useruid) /* Silently ignore boot only values */ if (bootonly && !bail) + { + delete Values[Index].val; continue; + } ConfValue(newconfig, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, MAXBUF, allow_newlines); ValueItem vi(item); @@ -1327,17 +1330,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) } - if (bail) - { - /** Note: This is safe, the method checks for user == NULL */ - ServerInstance->Threads->Lock(); - User* user = NULL; - if (!useruid.empty()) - user = ServerInstance->FindNick(useruid); - ServerInstance->Parser->SetupCommandTable(user); - ServerInstance->Threads->Unlock(); - } - else + if (!bail) { if (!useruid.empty()) {