Skip to content

Commit 3cdb233

Browse files
committed
feat(string): add digest length validation for DelEX IFDEQ/IFDNE
- Add 16-character digest validation for IFDEQ/IFDNE options in DelEX command - Return clear error if digest length is not exactly 16 hexadecimal characters - Add test case for invalid digest length rejection as requested by reviewer This commit only modifies DelEX command behavior.
1 parent 505108c commit 3cdb233

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

src/commands/cmd_string.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,17 @@ class CommandDelEX : public Commander {
118118
CommandParser parser(args, 2);
119119
while (parser.Good()) {
120120
if (parser.EatEqICase("ifdeq")) {
121-
option_ = {DelExOption::IFDEQ, GET_OR_RET(parser.TakeStr())};
121+
std::string digest = GET_OR_RET(parser.TakeStr());
122+
if (digest.size() != 16) {
123+
return {Status::RedisParseErr, "ERR digest must be exactly 16 hexadecimal characters"};
124+
}
125+
option_ = {DelExOption::IFDEQ, std::move(digest)};
122126
} else if (parser.EatEqICase("ifdne")) {
123-
option_ = {DelExOption::IFDNE, GET_OR_RET(parser.TakeStr())};
127+
std::string digest = GET_OR_RET(parser.TakeStr());
128+
if (digest.size() != 16) {
129+
return {Status::RedisParseErr, "ERR digest must be exactly 16 hexadecimal characters"};
130+
}
131+
option_ = {DelExOption::IFDNE, std::move(digest)};
124132
} else if (parser.EatEqICase("ifeq")) {
125133
option_ = {DelExOption::IFEQ, GET_OR_RET(parser.TakeStr())};
126134
} else if (parser.EatEqICase("ifne")) {

tests/gocase/unit/type/strings/strings_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,21 @@ func testString(t *testing.T, configs util.KvrocksServerConfigs) {
349349
require.Equal(t, "", rdb.Get(ctx, value).Val())
350350
})
351351

352+
t.Run("DelEX IFDEQ and IFDNE reject invalid digest length", func(t *testing.T) {
353+
key := "test-string-key-invalid-digest"
354+
value := "Hello world"
355+
356+
require.NoError(t, rdb.Del(ctx, key).Err())
357+
require.NoError(t, rdb.Set(ctx, key, value, 0).Err())
358+
require.ErrorContains(t, rdb.Do(ctx, "DelEX", key, "ifdeq", "123456789012345").Err(),
359+
"exactly 16 hexadecimal characters")
360+
require.Equal(t, value, rdb.Get(ctx, key).Val())
361+
362+
require.ErrorContains(t, rdb.Do(ctx, "DelEX", key, "ifdne", "123456789012345").Err(),
363+
"exactly 16 hexadecimal characters")
364+
require.Equal(t, value, rdb.Get(ctx, key).Val())
365+
})
366+
352367
t.Run("MGET command", func(t *testing.T) {
353368
require.NoError(t, rdb.FlushDB(ctx).Err())
354369
require.NoError(t, rdb.Set(ctx, "foo", "BAR", 0).Err())

0 commit comments

Comments
 (0)