From 3dde71f1ff4af2071e7318c635cf43caf5da76e0 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Fri, 5 Aug 2022 09:04:16 +0200 Subject: [PATCH] Fixed processing of long console commands --- src/console_commands.cpp | 41 ++++++++++++++++++++++++---------------- src/console_commands.h | 2 ++ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/console_commands.cpp b/src/console_commands.cpp index 67a28c4..e4def49 100644 --- a/src/console_commands.cpp +++ b/src/console_commands.cpp @@ -76,6 +76,8 @@ ConsoleCommands::ConsoleCommands(p2pool* pool) LOGERR(1, "failed to start event loop thread, error " << uv_err_name(err)); throw std::exception(); } + + m_command.reserve(64); } ConsoleCommands::~ConsoleCommands() @@ -252,25 +254,32 @@ void ConsoleCommands::stdinReadCallback(uv_stream_t* stream, ssize_t nread, cons ConsoleCommands* pThis = static_cast(stream->data); if (nread > 0) { - for (size_t i = 0; i < static_cast(nread); ++i) { - if ((buf->base[i] == '\r') || (buf->base[i] == '\n')) { - buf->base[i] = '\0'; + std::string& command = pThis->m_command; + command.append(buf->base, nread); - cmd* c = cmds; - for (; c->name.len; ++c) { - if (!strncmp(buf->base, c->name.str, c->name.len)) { - const char* args = (c->name.len + 1 <= i) ? (buf->base + c->name.len + 1) : ""; - c->func(pThis->m_pool, args); - break; - } - } - - if (!c->name.len) { - LOGWARN(0, "Unknown command " << buf->base); - } + do { + size_t k = command.find_first_of("\r\n"); + if (k == std::string::npos) { break; } - } + command[k] = '\0'; + + cmd* c = cmds; + for (; c->name.len; ++c) { + if (!strncmp(command.c_str(), c->name.str, c->name.len)) { + const char* args = (c->name.len + 1 <= k) ? (command.c_str() + c->name.len + 1) : ""; + c->func(pThis->m_pool, args); + break; + } + } + + if (!c->name.len) { + LOGWARN(0, "Unknown command " << command); + } + + k = command.find_first_not_of("\r\n", k + 1); + command.erase(0, k); + } while (true); } else if (nread < 0) { LOGWARN(4, "read error " << uv_err_name(static_cast(nread))); diff --git a/src/console_commands.h b/src/console_commands.h index 825225d..20e7944 100644 --- a/src/console_commands.h +++ b/src/console_commands.h @@ -40,6 +40,8 @@ private: char m_readBuf[64]; bool m_readBufInUse; + std::string m_command; + static void loop(void* data); static void on_shutdown(uv_async_t* async)