summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentino Geron <valentino@redislabs.com>2020-03-26 11:49:21 +0200
committerValentino Geron <valentino@redislabs.com>2020-03-26 15:46:31 +0200
commit9a1843ef2df09edcc28f4f1b2ace93a39d35cc59 (patch)
tree160e68c683061b2b92136f1d1963a04dc2a12496
parentc4d7f30e250b4b291e6d5893d9a3323df4a57c7c (diff)
downloadredis-9a1843ef2df09edcc28f4f1b2ace93a39d35cc59.tar.gz
XREAD and XREADGROUP should not be allowed from scripts when BLOCK option is being used
-rw-r--r--src/server.c4
-rw-r--r--src/t_stream.c5
-rw-r--r--tests/unit/scripting.tcl11
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