]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
Fix null dereference caused by tracking dummy
[user/henk/code/inspircd.git] / src / command_parse.cpp
index e4eb57e80bb10cad9d03dbc4d494a0d237e7c256..fe0aab3b98247d45a96333a7c1688b981087303f 100644 (file)
@@ -11,8 +11,6 @@
  * ---------------------------------------------------
  */
 
-/* $Core */
-
 #include "inspircd.h"
 #include "xline.h"
 #include "socketengine.h"
@@ -29,7 +27,7 @@
 int InspIRCd::PassCompare(Extensible* ex, const std::string &data, const std::string &input, const std::string &hashtype)
 {
        ModResult res;
-       FIRST_MOD_RESULT(this, OnPassCompare, res, (ex, data, input, hashtype));
+       FIRST_MOD_RESULT(OnPassCompare, res, (ex, data, input, hashtype));
 
        /* Module matched */
        if (res == MOD_RES_ALLOW)
@@ -226,23 +224,6 @@ CmdResult CommandParser::CallHandler(const std::string &commandname, const std::
        return CMD_INVALID;
 }
 
-void CommandParser::DoLines(User* current, bool one_only)
-{
-       while (current->BufferIsReady())
-       {
-               // use GetBuffer to copy single lines into the sanitized string
-               std::string single_line = current->GetBuffer();
-               current->bytes_in += single_line.length();
-               current->cmds_in++;
-               if (single_line.length() > MAXBUF - 2)  // MAXBUF is 514 to allow for neccessary line terminators
-                       single_line.resize(MAXBUF - 2); // So to trim to 512 here, we use MAXBUF - 2
-
-               // ProcessBuffer returns false if the user has gone over penalty
-               if (!ServerInstance->Parser->ProcessBuffer(single_line, current) || one_only)
-                       break;
-       }
-}
-
 bool CommandParser::ProcessCommand(User *user, std::string &cmd)
 {
        std::vector<std::string> command_p;
@@ -279,7 +260,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
        if (cm == cmdlist.end())
        {
                ModResult MOD_RESULT;
-               FIRST_MOD_RESULT(ServerInstance, OnPreCommand, MOD_RESULT, (command, command_p, user, false, cmd));
+               FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, false, cmd));
                if (MOD_RESULT == MOD_RES_DENY)
                        return true;
 
@@ -342,7 +323,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
         * truncate to max_params if necessary. -- w00t
         */
        ModResult MOD_RESULT;
-       FIRST_MOD_RESULT(ServerInstance, OnPreCommand, MOD_RESULT, (command, command_p, user, false, cmd));
+       FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, false, cmd));
        if (MOD_RESULT == MOD_RES_DENY)
                return true;
 
@@ -359,7 +340,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
                }
                if (!user->HasPermission(command))
                {
-                       user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to command %s",user->nick.c_str(),user->oper.c_str(),command.c_str());
+                       user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to command %s",user->nick.c_str(),irc::Spacify(user->oper.c_str()),command.c_str());
                        return do_more;
                }
        }
@@ -399,7 +380,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
                cm->second->total_bytes += cmd.length();
 
                /* module calls too */
-               FIRST_MOD_RESULT(ServerInstance, OnPreCommand, MOD_RESULT, (command, command_p, user, true, cmd));
+               FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, true, cmd));
                if (MOD_RESULT == MOD_RES_DENY)
                        return do_more;
 
@@ -413,48 +394,29 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
        }
 }
 
-void CommandParser::RemoveCommands(Module* source)
+void CommandParser::RemoveCommand(Command* x)
 {
-       Commandtable::iterator i,safei;
-       for (i = cmdlist.begin(); i != cmdlist.end();)
-       {
-               safei = i;
-               i++;
-               RemoveCommand(safei, source);
-       }
+       Commandtable::iterator n = cmdlist.find(x->command);
+       if (n != cmdlist.end() && n->second == x)
+               cmdlist.erase(n);
 }
 
-void CommandParser::RemoveCommand(Commandtable::iterator safei, Module* source)
+Command::~Command()
 {
-       Command* x = safei->second;
-       if (x->creator == source)
-       {
-               cmdlist.erase(safei);
-       }
+       ServerInstance->Parser->RemoveCommand(this);
 }
 
 bool CommandParser::ProcessBuffer(std::string &buffer,User *user)
 {
-       std::string::size_type a;
-
-       if (!user)
+       if (!user || buffer.empty())
                return true;
 
-       while ((a = buffer.rfind("\n")) != std::string::npos)
-               buffer.erase(a);
-       while ((a = buffer.rfind("\r")) != std::string::npos)
-               buffer.erase(a);
-
-       if (buffer.length())
-       {
-               ServerInstance->Logs->Log("USERINPUT", DEBUG,"C[%d] I :%s %s",user->GetFd(), user->nick.c_str(), buffer.c_str());
-               return this->ProcessCommand(user,buffer);
-       }
-
-       return true;
+       ServerInstance->Logs->Log("USERINPUT", DEBUG, "C[%d] I :%s %s", 
+               user->GetFd(), user->nick.c_str(), buffer.c_str());
+       return ProcessCommand(user,buffer);
 }
 
-bool CommandParser::CreateCommand(Command *f)
+bool CommandParser::AddCommand(Command *f)
 {
        /* create the command and push it onto the table */
        if (cmdlist.find(f->command) == cmdlist.end())
@@ -465,7 +427,7 @@ bool CommandParser::CreateCommand(Command *f)
        return false;
 }
 
-CommandParser::CommandParser(InspIRCd* Instance) : ServerInstance(Instance)
+CommandParser::CommandParser(
 {
        para.resize(128);
 }