This is an automated email from the ASF dual-hosted git repository.
hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new db4669a5 Fix server crash when receiving the empty inline command
(#1909)
db4669a5 is described below
commit db4669a59c992935a3dd473da821b3f9b21edfb0
Author: hulk <[email protected]>
AuthorDate: Fri Nov 24 22:07:43 2023 +0800
Fix server crash when receiving the empty inline command (#1909)
---
src/server/redis_connection.cc | 1 +
src/server/redis_request.cc | 1 +
tests/gocase/unit/protocol/protocol_test.go | 12 +++++++++++-
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/server/redis_connection.cc b/src/server/redis_connection.cc
index a7dec01d..4d468983 100644
--- a/src/server/redis_connection.cc
+++ b/src/server/redis_connection.cc
@@ -307,6 +307,7 @@ void Connection::ExecuteCommands(std::deque<CommandTokens>
*to_process_cmds) {
while (!to_process_cmds->empty()) {
auto cmd_tokens = to_process_cmds->front();
to_process_cmds->pop_front();
+ if (cmd_tokens.empty()) continue;
bool is_multi_exec = IsFlagEnabled(Connection::kMultiExec);
if (IsFlagEnabled(redis::Connection::kCloseAfterReply) && !is_multi_exec)
break;
diff --git a/src/server/redis_request.cc b/src/server/redis_request.cc
index 9d82d00f..f6faa7b1 100644
--- a/src/server/redis_request.cc
+++ b/src/server/redis_request.cc
@@ -91,6 +91,7 @@ Status Request::Tokenize(evbuffer *input) {
}
tokens_ = util::Split(std::string(line.get(), line.length), " \t");
+ if (tokens_.empty()) continue;
commands_.emplace_back(std::move(tokens_));
state_ = ArrayLen;
}
diff --git a/tests/gocase/unit/protocol/protocol_test.go
b/tests/gocase/unit/protocol/protocol_test.go
index de210413..9ba40bec 100644
--- a/tests/gocase/unit/protocol/protocol_test.go
+++ b/tests/gocase/unit/protocol/protocol_test.go
@@ -31,14 +31,24 @@ func TestProtocolNetwork(t *testing.T) {
srv := util.StartServer(t, map[string]string{})
defer srv.Close()
- t.Run("handle an empty array", func(t *testing.T) {
+ t.Run("empty bulk array command", func(t *testing.T) {
c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()
+ require.NoError(t, c.Write("*-1\r\n"))
+ require.NoError(t, c.Write("*0\r\n"))
require.NoError(t, c.Write("\r\n"))
require.NoError(t, c.Write("*1\r\n$4\r\nPING\r\n"))
c.MustRead(t, "+PONG")
})
+ t.Run("empty inline command", func(t *testing.T) {
+ c := srv.NewTCPClient()
+ defer func() { require.NoError(t, c.Close()) }()
+ require.NoError(t, c.Write(" \r\n"))
+ require.NoError(t, c.Write("*1\r\n$4\r\nPING\r\n"))
+ c.MustRead(t, "+PONG")
+ })
+
t.Run("out of range multibulk length", func(t *testing.T) {
c := srv.NewTCPClient()
defer func() { require.NoError(t, c.Close()) }()