diff --git a/src/Makefile b/src/Makefile index 269a70933..d6afa99b6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,7 +39,7 @@ endif endif # To get ARM stack traces if Redis crashes we need a special C flag. -ifneq (,$(findstring armv,$(uname_M))) +ifneq (,$(filter aarch64 armv,$(uname_M))) CFLAGS+=-funwind-tables endif diff --git a/src/debug.c b/src/debug.c index 293dbe36e..f239eea5a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -688,6 +688,8 @@ static void *getMcontextEip(ucontext_t *uc) { return (void*) uc->uc_mcontext.sc_ip; #elif defined(__arm__) /* Linux ARM */ return (void*) uc->uc_mcontext.arm_pc; + #elif defined(__aarch64__) /* Linux AArch64 */ + return (void*) uc->uc_mcontext.pc; #endif #else return NULL; diff --git a/src/redis-cli.c b/src/redis-cli.c index 850b10241..d106d8f5d 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -1058,7 +1058,7 @@ static int cliReadReply(int output_raw_strings) { return REDIS_OK; } -static int cliSendCommand(int argc, char **argv, int repeat) { +static int cliSendCommand(int argc, char **argv, long repeat) { char *command = argv[0]; size_t *argvlen; int j, output_raw; @@ -1121,7 +1121,7 @@ static int cliSendCommand(int argc, char **argv, int repeat) { for (j = 0; j < argc; j++) argvlen[j] = sdslen(argv[j]); - while(repeat--) { + while(repeat-- > 0) { redisAppendCommandArgv(context,argc,(const char**)argv,argvlen); while (config.monitor_mode) { if (cliReadReply(output_raw) != REDIS_OK) exit(1); @@ -1229,6 +1229,7 @@ static int parseOptions(int argc, char **argv) { } else if (!strcmp(argv[i],"-n") && !lastarg) { config.dbnum = atoi(argv[++i]); } else if (!strcmp(argv[i],"-a") && !lastarg) { + fputs("Warning: Using a password with '-a' option on the command line interface may not be safe.\n", stderr); config.auth = argv[++i]; } else if (!strcmp(argv[i],"-u") && !lastarg) { parseRedisUri(argv[++i]); @@ -1621,9 +1622,35 @@ static void repl(void) { cliRefreshPrompt(); while((line = linenoise(context ? config.prompt : "not connected> ")) != NULL) { if (line[0] != '\0') { + long repeat = 1; + int skipargs = 0; + char *endptr = NULL; + argv = cliSplitArgs(line,&argc); - if (history) linenoiseHistoryAdd(line); - if (historyfile) linenoiseHistorySave(historyfile); + + /* check if we have a repeat command option and + * need to skip the first arg */ + if (argv && argc > 0) { + errno = 0; + repeat = strtol(argv[0], &endptr, 10); + if (argc > 1 && *endptr == '\0') { + if (errno == ERANGE || errno == EINVAL || repeat <= 0) { + fputs("Invalid redis-cli repeat command option value.\n", stdout); + sdsfreesplitres(argv, argc); + linenoiseFree(line); + continue; + } + skipargs = 1; + } else { + repeat = 1; + } + } + + /* Won't save auth command in history file */ + if (!(argv && argc > 0 && !strcasecmp(argv[0+skipargs], "auth"))) { + if (history) linenoiseHistoryAdd(line); + if (historyfile) linenoiseHistorySave(historyfile); + } if (argv == NULL) { printf("Invalid argument(s)\n"); @@ -1636,6 +1663,8 @@ static void repl(void) { exit(0); } else if (argv[0][0] == ':') { cliSetPreferences(argv,argc,1); + sdsfreesplitres(argv,argc); + linenoiseFree(line); continue; } else if (strcasecmp(argv[0],"restart") == 0) { if (config.eval) { @@ -1655,15 +1684,6 @@ static void repl(void) { linenoiseClearScreen(); } else { long long start_time = mstime(), elapsed; - int repeat, skipargs = 0; - char *endptr; - - repeat = strtol(argv[0], &endptr, 10); - if (argc > 1 && *endptr == '\0' && repeat) { - skipargs = 1; - } else { - repeat = 1; - } issueCommandRepeat(argc-skipargs, argv+skipargs, repeat); diff --git a/src/t_stream.c b/src/t_stream.c index 1e46c6367..8f0505c30 100644 --- a/src/t_stream.c +++ b/src/t_stream.c @@ -1073,7 +1073,7 @@ void xaddCommand(client *c) { int field_pos = i+1; /* Check arity. */ - if ((c->argc - field_pos) < 2 || (c->argc-field_pos % 2) == 1) { + if ((c->argc - field_pos) < 2 || ((c->argc-field_pos) % 2) == 1) { addReplyError(c,"wrong number of arguments for XADD"); return; }