From ce1ad5f8c88ed90351138beb5be9b0962bd3eec1 Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Wed, 18 Apr 2012 21:40:57 +0200 Subject: [PATCH] Fix crash in m_rline m_rline only called UseInterface() in the constructor, so when there was no regex engine loaded UseInterface() did nothing. If the specifed regex engine was loaded later on this resulted in being able to unload it behind the back of m_rline and crash the server whenever the engine was accessed. --- src/modules/m_rline.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/modules/m_rline.cpp b/src/modules/m_rline.cpp index 2a50f6c1cd..24d39fcb9f 100644 --- a/src/modules/m_rline.cpp +++ b/src/modules/m_rline.cpp @@ -190,15 +190,14 @@ class ModuleRLine : public Module RLineFactory *f; bool MatchOnNickChange; std::string RegexEngine; + bool usedinterface; public: - ModuleRLine(InspIRCd* Me) : Module(Me) + ModuleRLine(InspIRCd* Me) : Module(Me), usedinterface(false) { mymodule = this; OnRehash(NULL); - Me->Modules->UseInterface("RegularExpression"); - // Create a new command r = new CommandRLine(ServerInstance); ServerInstance->AddCommand(r); @@ -213,7 +212,8 @@ class ModuleRLine : public Module virtual ~ModuleRLine() { - ServerInstance->Modules->DoneWithInterface("RegularExpression"); + if (usedinterface) + ServerInstance->Modules->DoneWithInterface("RegularExpression"); ServerInstance->XLines->DelAll("R"); ServerInstance->XLines->UnregisterFactory(f); delete f; @@ -262,6 +262,11 @@ class ModuleRLine : public Module { ServerInstance->SNO->WriteToSnoMask('x', "R-Line now using engine '%s'", RegexEngine.c_str()); rxengine = *i; + if (!usedinterface) + { + ServerInstance->Modules->UseInterface("RegularExpression"); + usedinterface = true; + } } } } @@ -289,6 +294,11 @@ class ModuleRLine : public Module { ServerInstance->SNO->WriteToSnoMask('x', "R-Line now using engine '%s'", RegexEngine.c_str()); rxengine = mod; + if (!usedinterface) + { + ServerInstance->Modules->UseInterface("RegularExpression"); + usedinterface = true; + } } } }