Check for integer validity in setex command

This commit is contained in:
Roman Gershman 2022-03-14 19:51:42 +02:00
parent affabbaee7
commit f9b70125d6
4 changed files with 10 additions and 5 deletions

View File

@ -22,7 +22,7 @@ extern const char kInvalidDbIndErr[];
extern const char kScriptNotFound[]; extern const char kScriptNotFound[];
extern const char kAuthRejected[]; extern const char kAuthRejected[];
extern const char kExpiryOutOfRange[]; extern const char kExpiryOutOfRange[];
extern const char kInvalidExpireTime[];
extern const char kSyntaxErrType[]; extern const char kSyntaxErrType[];
extern const char kScriptErrType[]; extern const char kScriptErrType[];

View File

@ -61,7 +61,7 @@ const char kInvalidDbIndErr[] = "invalid DB index";
const char kScriptNotFound[] = "-NOSCRIPT No matching script. Please use EVAL."; const char kScriptNotFound[] = "-NOSCRIPT No matching script. Please use EVAL.";
const char kAuthRejected[] = "-WRONGPASS invalid username-password pair or user is disabled."; const char kAuthRejected[] = "-WRONGPASS invalid username-password pair or user is disabled.";
const char kExpiryOutOfRange[] = "expiry is out of range"; const char kExpiryOutOfRange[] = "expiry is out of range";
const char kInvalidExpireTime[] = "invalid expire time";
const char kSyntaxErrType[] = "syntax_error"; const char kSyntaxErrType[] = "syntax_error";
const char kScriptErrType[] = "script_error"; const char kScriptErrType[] = "script_error";

View File

@ -172,12 +172,16 @@ void StringFamily::SetEx(CmdArgList args, ConnectionContext* cntx) {
string_view key = ArgS(args, 1); string_view key = ArgS(args, 1);
string_view ex = ArgS(args, 2); string_view ex = ArgS(args, 2);
string_view value = ArgS(args, 3); string_view value = ArgS(args, 3);
uint32_t secs; int32_t secs;
if (!absl::SimpleAtoi(ex, &secs)) { if (!absl::SimpleAtoi(ex, &secs)) {
return (*cntx)->SendError(kInvalidIntErr); return (*cntx)->SendError(kInvalidIntErr);
} }
if (secs < 1) {
return (*cntx)->SendError(absl::StrCat(facade::kInvalidExpireTime, " in setex"));
}
SetCmd::SetParams sparams{cntx->db_index()}; SetCmd::SetParams sparams{cntx->db_index()};
sparams.expire_after_ms = uint64_t(secs) * 1000; sparams.expire_after_ms = uint64_t(secs) * 1000;

View File

@ -253,9 +253,10 @@ TEST_F(StringFamilyTest, MSetIncr) {
} }
TEST_F(StringFamilyTest, SetEx) { TEST_F(StringFamilyTest, SetEx) {
ASSERT_THAT(Run({"setex", "key", "1", "val"}), RespEq("OK"));
ASSERT_THAT(Run({"setex", "key", "10", "val"}), RespEq("OK")); ASSERT_THAT(Run({"setex", "key", "10", "val"}), RespEq("OK"));
ASSERT_THAT(Run({"setex", "key", "10", "val"}), RespEq("OK")); ASSERT_THAT(Run({"ttl", "key"}), ElementsAre(IntArg(10)));
ASSERT_THAT(Run({"setex", "key", "10", "val"}), RespEq("OK")); ASSERT_THAT(Run({"setex", "key", "0", "val"}), ElementsAre(ErrArg("invalid expire time")));
} }
} // namespace dfly } // namespace dfly