X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Ftoe.c;h=92819c195d1f3a4dc2b14dac5a486e5415b8fac0;hp=60a76a2223a8f03a0ffb95372556051d92692b20;hb=deb0d07e8eb4803b9e9653359eab17a30d04369d;hpb=f6b436c4fb50275df43ea10ba9c744fe195a327d diff --git a/progs/toe.c b/progs/toe.c index 60a76a22..92819c19 100644 --- a/progs/toe.c +++ b/progs/toe.c @@ -45,7 +45,7 @@ #include #endif -MODULE_ID("$Id: toe.c,v 1.83 2021/09/21 20:07:51 tom Exp $") +MODULE_ID("$Id: toe.c,v 1.86 2021/10/10 00:55:32 tom Exp $") #define isDotname(name) (!strcmp(name, ".") || !strcmp(name, "..")) @@ -146,6 +146,7 @@ show_termdata(int eargc, char **eargv) if (use_termdata > 1) qsort(ptr_termdata, use_termdata, sizeof(TERMDATA), compare_termdata); for (n = 0; n < use_termdata; ++n) { + int nk = -1; /* * If there is more than one database, show how they differ. @@ -154,6 +155,11 @@ show_termdata(int eargc, char **eargv) unsigned long check = 0; int k = 0; for (;;) { + char mark = ((check == 0 + || (check != ptr_termdata[n].checksum)) + ? '*' + : '+'); + for (; k < ptr_termdata[n].db_index; ++k) { printf("--"); } @@ -163,11 +169,10 @@ show_termdata(int eargc, char **eargv) * from the first entry's checksum, print "*". Otherwise * it looks enough like a duplicate to print "+". */ - printf("%c-", ((check == 0 - || (check != ptr_termdata[n].checksum)) - ? '*' - : '+')); + printf("%c-", mark); check = ptr_termdata[n].checksum; + if (mark == '*' && nk < 0) + nk = (int) n; ++k; if ((n + 1) >= use_termdata @@ -182,10 +187,12 @@ show_termdata(int eargc, char **eargv) } printf(":\t"); } + if (nk < 0) + nk = (int) n; (void) printf("%-10s\t%s\n", ptr_termdata[n].term_name, - ptr_termdata[n].description); + ptr_termdata[nk].description); } } } @@ -330,6 +337,26 @@ sorthook(int db_index, int db_limit, const char *term_name, TERMTYPE2 *tp) } #if NCURSES_USE_TERMCAP +/* + * Check if the buffer contents are printable ASCII, ensuring that we do not + * accidentally pick up incompatible binary content from a hashed database. + */ +static bool +is_termcap(char *buffer) +{ + bool result = TRUE; + while (*buffer != '\0') { + int ch = UChar(*buffer++); + if (ch == '\t') + continue; + if (ch < ' ' || ch > '~') { + result = FALSE; + break; + } + } + return result; +} + static void show_termcap(int db_index, int db_limit, char *buffer, DescHook hook) { @@ -518,11 +545,13 @@ typelist(int eargc, char *eargv[], db_array[1] = 0; if (cgetfirst(&buffer, db_array) > 0) { - show_termcap(i, eargc, buffer, hook); - free(buffer); - while (cgetnext(&buffer, db_array) > 0) { + if (is_termcap(buffer)) { show_termcap(i, eargc, buffer, hook); free(buffer); + while (cgetnext(&buffer, db_array) > 0) { + show_termcap(i, eargc, buffer, hook); + free(buffer); + } } cgetclose(); continue; @@ -539,6 +568,8 @@ typelist(int eargc, char *eargv[], if ((fp = safe_fopen(eargv[i], "r")) != 0) { while (fgets(buffer, sizeof(buffer), fp) != 0) { + if (!is_termcap(buffer)) + break; if (*buffer == '#') continue; if (isspace(*buffer))