summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2020-04-03 11:14:13 +0200
committerGitHub <noreply@github.com>2020-04-03 11:14:13 +0200
commitcbf212f981607dcef8534813363ba723b0560b9b (patch)
treed47110cc4b03cee10d94fff0ad90eec9ef89bbc2
parent4158664d2bad1dbc7008db4cb4bf1c4e1944cfc4 (diff)
parent9a1843ef2df09edcc28f4f1b2ace93a39d35cc59 (diff)
downloadredis-cbf212f981607dcef8534813363ba723b0560b9b.tar.gz
Merge pull request #7030 from valentinogeron/xread-in-lua
XREAD and XREADGROUP should not be allowed from scripts when BLOCK op…
-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 ff7a39df5..9ebf0ee6b 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 3f8cbfcfa..e0af87f97 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -1374,6 +1374,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