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 kAuthRejected[];
extern const char kExpiryOutOfRange[];
extern const char kInvalidExpireTime[];
extern const char kSyntaxErrType[];
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 kAuthRejected[] = "-WRONGPASS invalid username-password pair or user is disabled.";
const char kExpiryOutOfRange[] = "expiry is out of range";
const char kInvalidExpireTime[] = "invalid expire time";
const char kSyntaxErrType[] = "syntax_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 ex = ArgS(args, 2);
string_view value = ArgS(args, 3);
uint32_t secs;
int32_t secs;
if (!absl::SimpleAtoi(ex, &secs)) {
return (*cntx)->SendError(kInvalidIntErr);
}
if (secs < 1) {
return (*cntx)->SendError(absl::StrCat(facade::kInvalidExpireTime, " in setex"));
}
SetCmd::SetParams sparams{cntx->db_index()};
sparams.expire_after_ms = uint64_t(secs) * 1000;

View File

@ -253,9 +253,10 @@ TEST_F(StringFamilyTest, MSetIncr) {
}
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", "0", "val"}), ElementsAre(ErrArg("invalid expire time")));
}
} // namespace dfly