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

@ -64,7 +64,10 @@ 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]);
@ -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,29 +156,11 @@ 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")) {
/* Use el_no_echo when reading passwords and similar */
if (!strncmp(line, "unlock", 6)) {
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); free(line);
continue; fprintf(stderr, "\nSecurity breach, user logged out!\n");
}
el_no_echo = 0;
printf("\nAchievement unlocked!\n");
free(line);
next = 1;
break; break;
} }
}
if (next)
continue;
if (*line != '\0') if (*line != '\0')
printf("\t\t\t|%s|\n", line); printf("\t\t\t|%s|\n", line);