diff options
author | Valentino Geron <valentino@redislabs.com> | 2020-03-26 11:49:21 +0200 |
---|---|---|
committer | Valentino Geron <valentino@redislabs.com> | 2020-03-26 15:46:31 +0200 |
commit | 9a1843ef2df09edcc28f4f1b2ace93a39d35cc59 (patch) | |
tree | 160e68c683061b2b92136f1d1963a04dc2a12496 | |
parent | c4d7f30e250b4b291e6d5893d9a3323df4a57c7c (diff) | |
download | redis-9a1843ef2df09edcc28f4f1b2ace93a39d35cc59.tar.gz |
XREAD and XREADGROUP should not be allowed from scripts when BLOCK option is being used
-rw-r--r-- | src/server.c | 4 | ||||
-rw-r--r-- | src/t_stream.c | 5 | ||||
-rw-r--r-- | tests/unit/scripting.tcl | 11 |
3 files changed, 18 insertions, 2 deletions
diff --git a/src/server.c b/src/server.c index 84439461e..4fc7e0103 100644 --- a/src/server.c +++ b/src/server.c @@ -947,11 +947,11 @@ struct redisCommand redisCommandTable[] = { 0,NULL,1,1,1,0,0,0}, {"xread",xreadCommand,-4, - "read-only no-script @stream @blocking", + "read-only @stream @blocking", 0,xreadGetKeys,1,1,1,0,0,0}, {"xreadgroup",xreadCommand,-7, - "write no-script @stream @blocking", + "write @stream @blocking", 0,xreadGetKeys,1,1,1,0,0,0}, {"xgroup",xgroupCommand,-2, diff --git a/src/t_stream.c b/src/t_stream.c index 557d1d642..157f1eaeb 100644 --- a/src/t_stream.c +++ b/src/t_stream.c @@ -1373,6 +1373,11 @@ void xreadCommand(client *c) { int moreargs = c->argc-i-1; char *o = c->argv[i]->ptr; if (!strcasecmp(o,"BLOCK") && moreargs) { + if (c->flags & CLIENT_LUA) { + /* There is no sense to use BLOCK option within LUA */ + addReplyErrorFormat(c, "%s command is not allowed with BLOCK option from scripts", (char *)c->argv[0]->ptr); + return; + } i++; if (getTimeoutFromObjectOrReply(c,c->argv[i],&timeout, UNIT_MILLISECONDS) != C_OK) return; diff --git a/tests/unit/scripting.tcl b/tests/unit/scripting.tcl index fb36d0b80..8b364b287 100644 --- a/tests/unit/scripting.tcl +++ b/tests/unit/scripting.tcl @@ -146,6 +146,17 @@ start_server {tags {"scripting"}} { set e } {*not allowed*} + test {EVAL - Scripts can't run XREAD and XREADGROUP with BLOCK option} { + r del s + r xgroup create s g $ MKSTREAM + set res [r eval {return redis.pcall('xread','STREAMS','s','$')} 1 s] + assert {$res eq {}} + assert_error "*xread command is not allowed with BLOCK option from scripts" {r eval {return redis.pcall('xread','BLOCK',0,'STREAMS','s','$')} 1 s} + set res [r eval {return redis.pcall('xreadgroup','group','g','c','STREAMS','s','>')} 1 s] + assert {$res eq {}} + assert_error "*xreadgroup command is not allowed with BLOCK option from scripts" {r eval {return redis.pcall('xreadgroup','group','g','c','BLOCK',0,'STREAMS','s','>')} 1 s} + } + test {EVAL - Scripts can't run certain commands} { set e {} r debug lua-always-replicate-commands 0 |