wpa_cli: fix readline history cleaning
authorEygene Ryabinkin <rea-fbsd@codelabs.ru>
Mon, 5 Jan 2009 18:48:45 +0000 (20:48 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 5 Jan 2009 18:48:45 +0000 (20:48 +0200)
First of all, the history had not been written to the disk, since almost
all commands were cleaned up due to the error in the history cleaning:
the return value of the last os_strncasecmp() call was not compared to
zero, but was rather used as is.  So the condition was almost always
true and most commands were removed from the history.

The second problem was that the evaluation of the potentially sensitive
commands was started at the entry number 1, instead of very first entry.

wpa_supplicant/wpa_cli.c

index bd1a5a6..e531001 100644 (file)
@@ -1519,24 +1519,22 @@ static void wpa_cli_interactive(void)
                 * passwords. */
                HIST_ENTRY *h;
                history_set_pos(0);
-               h = next_history();
-               while (h) {
+               while ((h = current_history())) {
                        char *p = h->line;
                        while (*p == ' ' || *p == '\t')
                                p++;
                        if (os_strncasecmp(p, "pa", 2) == 0 ||
                            os_strncasecmp(p, "o", 1) == 0 ||
-                           os_strncasecmp(p, "n", 1)) {
+                           os_strncasecmp(p, "n", 1) == 0) {
                                h = remove_history(where_history());
                                if (h) {
                                        os_free(h->line);
                                        os_free(h->data);
                                        os_free(h);
-                               }
-                               h = current_history();
-                       } else {
-                               h = next_history();
-                       }
+                               } else
+                                       next_history();
+                       } else
+                               next_history();
                }
                write_history(hfile);
                os_free(hfile);