diff --git a/helio b/helio index 05c316e171e3..2ab4412b78af 160000 --- a/helio +++ b/helio @@ -1 +1 @@ -Subproject commit 05c316e171e31a6f23165b426b7caf0174f90838 +Subproject commit 2ab4412b78afbf7d3102b472fb0e6f70b194a535 diff --git a/src/core/dash.h b/src/core/dash.h index de7a025d44d3..09dad365b4a5 100644 --- a/src/core/dash.h +++ b/src/core/dash.h @@ -954,12 +954,13 @@ auto DashTable<_Key, _Value, Policy>::GetRandomCursor(absl::BitGen* bitgen) -> C template template auto DashTable<_Key, _Value, Policy>::Traverse(Cursor curs, Cb&& cb) -> Cursor { - if (curs.bucket_id() >= Policy::kBucketNum) // sanity. - return 0; - uint32_t sid = curs.segment_id(global_depth_); uint8_t bid = curs.bucket_id(); + // Test validity of the cursor. + if (bid >= Policy::kBucketNum || sid >= segment_.size()) + return 0; + auto hash_fun = [this](const auto& k) { return policy_.HashFn(k); }; bool fetched = false; diff --git a/src/server/generic_family_test.cc b/src/server/generic_family_test.cc index 68d54ea6f82c..e2c1ed605ed8 100644 --- a/src/server/generic_family_test.cc +++ b/src/server/generic_family_test.cc @@ -872,4 +872,9 @@ TEST_F(GenericFamilyTest, RestoreOOM) { EXPECT_THAT(resp, ErrArg("Out of memory")); } +TEST_F(GenericFamilyTest, Bug4466) { + auto resp = Run({"SCAN","9223372036854775808"}); // an invalid cursor should not crash us. + EXPECT_THAT(resp, RespElementsAre("0", RespElementsAre())); +} + } // namespace dfly diff --git a/src/server/script_mgr.cc b/src/server/script_mgr.cc index 0053a02f470f..ee29617a7d1c 100644 --- a/src/server/script_mgr.cc +++ b/src/server/script_mgr.cc @@ -43,6 +43,7 @@ ABSL_FLAG( std::vector({ "351130589c64523cb98978dc32c64173a31244f3", // Sidekiq, see #2442 "6ae15ef4678593dc61f991c9953722d67d822776", // Sidekiq, see #2442 + "34b1048274c8e50a0cc587a3ed9c383a82bb78c5" // Sidekiq }), "Comma-separated list of Lua script SHAs which are allowed to access undeclared keys. SHAs are " "only looked at when loading the script, and new values do not affect already-loaded script.");