examples: Refactor CLI unlock gimmick to fix possible Coverity issue

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
Joachim Nilsson 2020-01-05 08:21:36 +01:00
parent d9f725f20a
commit 1305d05b75

View File

@ -38,9 +38,9 @@ static char *my_rl_complete(char *token, int *match)
int count = 0; int count = 0;
for (i = 0; list[i]; i++) { for (i = 0; list[i]; i++) {
int partlen = strlen (token); /* Part of token */ int partlen = strlen(token); /* Part of token */
if (!strncmp (list[i], token, partlen)) { if (!strncmp(list[i], token, partlen)) {
index = i; index = i;
matchlen = partlen; matchlen = partlen;
count ++; count ++;
@ -49,7 +49,7 @@ static char *my_rl_complete(char *token, int *match)
if (count == 1) { if (count == 1) {
*match = 1; *match = 1;
return strdup (list[index] + matchlen); return strdup(list[index] + matchlen);
} }
return NULL; return NULL;
@ -64,11 +64,14 @@ static int my_rl_list_possib(char *token, char ***av)
for (num = 0; list[num]; num++) for (num = 0; list[num]; num++)
; ;
copy = (char **) malloc (num * sizeof(char *)); if (!num)
return 0;
copy = malloc(num * sizeof(char *));
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
if (!strncmp (list[i], token, strlen (token))) { if (!strncmp(list[i], token, strlen (token))) {
copy[total] = strdup (list[i]); copy[total] = strdup(list[i]);
total ++; total++;
} }
} }
*av = copy; *av = copy;
@ -106,14 +109,41 @@ el_status_t do_suspend(void)
static void breakit(int signo) static void breakit(int signo)
{ {
(void)signo;
puts("Got SIGINT"); puts("Got SIGINT");
} }
/* Use el_no_echo when reading passwords and similar */
static int unlock(const char *passwd)
{
char *prompt = "Enter password: ";
char *line;
int rc = 1;
el_no_echo = 1;
while ((line = readline(prompt))) {
rc = strncmp(line, passwd, strlen(passwd));
free(line);
if (rc) {
printf("\nWrong password, please try again, it's secret.\n");
continue;
}
printf("\nAchievement unlocked!\n");
break;
}
el_no_echo = 0;
return rc;
}
int main(void) int main(void)
{ {
char *line; char *line;
char *prompt = "cli> "; char *prompt = "cli> ";
char *passwd = "Enter password: ";
signal(SIGINT, breakit); signal(SIGINT, breakit);
@ -126,30 +156,12 @@ int main(void)
read_history(HISTORY); read_history(HISTORY);
while ((line = readline(prompt))) { while ((line = readline(prompt))) {
int next = 0; if (!strncmp(line, "unlock", 6) && unlock("secret")) {
free(line);
/* Use el_no_echo when reading passwords and similar */ fprintf(stderr, "\nSecurity breach, user logged out!\n");
if (!strncmp(line, "unlock", 6)) { break;
el_no_echo = 1;
while ((line = readline(passwd))) {
if (strncmp(line, "secret", 6)) {
printf("\nWrong password, please try again, it's secret.\n");
free(line);
continue;
}
el_no_echo = 0;
printf("\nAchievement unlocked!\n");
free(line);
next = 1;
break;
}
} }
if (next)
continue;
if (*line != '\0') if (*line != '\0')
printf("\t\t\t|%s|\n", line); printf("\t\t\t|%s|\n", line);
free(line); free(line);