]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix a crash when the core_oper module is not loaded.
authorPeter Powell <petpow@saberuk.com>
Wed, 12 Dec 2018 13:51:26 +0000 (13:51 +0000)
committerPeter Powell <petpow@saberuk.com>
Wed, 12 Dec 2018 14:43:55 +0000 (14:43 +0000)
src/modules/m_spanningtree/opertype.cpp
src/usermanager.cpp
src/users.cpp

index 473cdb8571e5ad1f608784edf0c261a7b26ed730..99c5ea8bc44bd08ea80f97acc9b60dce97526390 100644 (file)
@@ -33,7 +33,8 @@ CmdResult CommandOpertype::HandleRemote(RemoteUser* u, CommandBase::Params& para
                ServerInstance->Users->all_opers.push_back(u);
 
        ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
-       u->SetMode(opermh, true);
+       if (opermh)
+               u->SetMode(opermh, true);
 
        ServerConfig::OperIndex::const_iterator iter = ServerInstance->Config->OperTypes.find(opertype);
        if (iter != ServerInstance->Config->OperTypes.end())
index 968d5db0017fe282430c9405ae9b0b5e156d9b6f..6f9d15502d28d47be552e4d0d996a3f38a8ae8e4 100644 (file)
@@ -221,6 +221,7 @@ void UserManager::QuitUser(User* user, const std::string& quitreason, const std:
 
        uuidlist.erase(user->uuid);
        user->PurgeEmptyChannels();
+       user->UnOper();
 }
 
 void UserManager::AddClone(User* user)
index 8f20b7523fca082dd751f4d8812660c7f37e95ed..f11a7a38079e43d3fba28c9fc914f1ce0fcc3deb 100644 (file)
@@ -357,10 +357,12 @@ CullResult FakeUser::cull()
 void User::Oper(OperInfo* info)
 {
        ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
-       if (this->IsModeSet(opermh))
-               this->UnOper();
-
-       this->SetMode(opermh, true);
+       if (opermh)
+       {
+               if (this->IsModeSet(opermh))
+                       this->UnOper();
+               this->SetMode(opermh, true);
+       }
        this->oper = info;
 
        LocalUser* localuser = IS_LOCAL(this);
@@ -474,7 +476,8 @@ void User::UnOper()
        stdalgo::vector::swaperase(ServerInstance->Users->all_opers, this);
 
        ModeHandler* opermh = ServerInstance->Modes->FindMode('o', MODETYPE_USER);
-       this->SetMode(opermh, false);
+       if (opermh)
+               this->SetMode(opermh, false);
        FOREACH_MOD(OnPostDeoper, (this));
 }
 
@@ -1161,8 +1164,6 @@ void User::PurgeEmptyChannels()
                ++i;
                c->DelUser(this);
        }
-
-       this->UnOper();
 }
 
 void User::WriteNotice(const std::string& text)