mirror of
https://github.com/fluencelabs/redis
synced 2025-03-17 16:10:50 +00:00
Add tests for quotation in an interactive redis-cli session
Patched redis-cli to abort on unexpected quotation. This caused redis-cli to get into an infinite, memory-consuming loop.
This commit is contained in:
parent
f2dd4769dd
commit
0439d792c4
@ -378,7 +378,7 @@ static char **splitArguments(char *line, int *argc) {
|
||||
if (*p) {
|
||||
/* get a token */
|
||||
int inq=0; /* set to 1 if we are in "quotes" */
|
||||
int done = 0;
|
||||
int done=0;
|
||||
|
||||
if (current == NULL) current = sdsempty();
|
||||
while(!done) {
|
||||
@ -397,7 +397,12 @@ static char **splitArguments(char *line, int *argc) {
|
||||
}
|
||||
current = sdscatlen(current,&c,1);
|
||||
} else if (*p == '"') {
|
||||
done = 1;
|
||||
/* closing quote must be followed by a space */
|
||||
if (*(p+1) && !isspace(*(p+1))) goto err;
|
||||
done=1;
|
||||
} else if (!*p) {
|
||||
/* unterminated quotes */
|
||||
goto err;
|
||||
} else {
|
||||
current = sdscatlen(current,p,1);
|
||||
}
|
||||
@ -429,6 +434,13 @@ static char **splitArguments(char *line, int *argc) {
|
||||
return vector;
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
while(*argc--)
|
||||
sdsfree(vector[*argc]);
|
||||
zfree(vector);
|
||||
if (current) sdsfree(current);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define LINE_BUFLEN 4096
|
||||
@ -441,7 +453,10 @@ static void repl() {
|
||||
argv = splitArguments(line,&argc);
|
||||
linenoiseHistoryAdd(line);
|
||||
if (config.historyfile) linenoiseHistorySave(config.historyfile);
|
||||
if (argc > 0) {
|
||||
if (argv == NULL) {
|
||||
printf("Invalid argument(s)\n");
|
||||
continue;
|
||||
} else if (argc > 0) {
|
||||
if (strcasecmp(argv[0],"quit") == 0 ||
|
||||
strcasecmp(argv[0],"exit") == 0)
|
||||
exit(0);
|
||||
|
@ -66,4 +66,23 @@ start_server {tags {"cli"}} {
|
||||
r rpush list bar
|
||||
assert_equal "1. \"foo\"\n2. \"bar\"" [run_command $fd "lrange list 0 -1"]
|
||||
}
|
||||
|
||||
test_interactive_cli "Parsing quotes" {
|
||||
assert_equal "OK" [run_command $fd "set key \"bar\""]
|
||||
assert_equal "bar" [r get key]
|
||||
assert_equal "OK" [run_command $fd "set key \" bar \""]
|
||||
assert_equal " bar " [r get key]
|
||||
assert_equal "OK" [run_command $fd "set key \"\\\"bar\\\"\""]
|
||||
assert_equal "\"bar\"" [r get key]
|
||||
assert_equal "OK" [run_command $fd "set key \"\tbar\t\""]
|
||||
assert_equal "\tbar\t" [r get key]
|
||||
|
||||
# invalid quotation
|
||||
assert_equal "Invalid argument(s)" [run_command $fd "get \"\"key"]
|
||||
assert_equal "Invalid argument(s)" [run_command $fd "get \"key\"x"]
|
||||
|
||||
# quotes after the argument are weird, but should be allowed
|
||||
assert_equal "OK" [run_command $fd "set key\"\" bar"]
|
||||
assert_equal "bar" [r get key]
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user