mirror of
https://github.com/fluencelabs/redis
synced 2025-04-01 15:21:03 +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) {
|
if (*p) {
|
||||||
/* get a token */
|
/* get a token */
|
||||||
int inq=0; /* set to 1 if we are in "quotes" */
|
int inq=0; /* set to 1 if we are in "quotes" */
|
||||||
int done = 0;
|
int done=0;
|
||||||
|
|
||||||
if (current == NULL) current = sdsempty();
|
if (current == NULL) current = sdsempty();
|
||||||
while(!done) {
|
while(!done) {
|
||||||
@ -397,7 +397,12 @@ static char **splitArguments(char *line, int *argc) {
|
|||||||
}
|
}
|
||||||
current = sdscatlen(current,&c,1);
|
current = sdscatlen(current,&c,1);
|
||||||
} else if (*p == '"') {
|
} 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 {
|
} else {
|
||||||
current = sdscatlen(current,p,1);
|
current = sdscatlen(current,p,1);
|
||||||
}
|
}
|
||||||
@ -429,6 +434,13 @@ static char **splitArguments(char *line, int *argc) {
|
|||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err:
|
||||||
|
while(*argc--)
|
||||||
|
sdsfree(vector[*argc]);
|
||||||
|
zfree(vector);
|
||||||
|
if (current) sdsfree(current);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LINE_BUFLEN 4096
|
#define LINE_BUFLEN 4096
|
||||||
@ -441,7 +453,10 @@ static void repl() {
|
|||||||
argv = splitArguments(line,&argc);
|
argv = splitArguments(line,&argc);
|
||||||
linenoiseHistoryAdd(line);
|
linenoiseHistoryAdd(line);
|
||||||
if (config.historyfile) linenoiseHistorySave(config.historyfile);
|
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 ||
|
if (strcasecmp(argv[0],"quit") == 0 ||
|
||||||
strcasecmp(argv[0],"exit") == 0)
|
strcasecmp(argv[0],"exit") == 0)
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -66,4 +66,23 @@ start_server {tags {"cli"}} {
|
|||||||
r rpush list bar
|
r rpush list bar
|
||||||
assert_equal "1. \"foo\"\n2. \"bar\"" [run_command $fd "lrange list 0 -1"]
|
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