fix potential buffer overflow in add_menu_coloring()
fix potential buffer overflow in sym_val()
fix potential buffer overflow in pline(), raw_printf(), and config_error_add()
+ via bad config file values or command line arguments
+fix potential buffer overflow in choose_windows()
Fixes to Post-3.6.4 Problems that Were Exposed Via git Repository
* print selected parts of score list.
* argc >= 2, with argv[0] untrustworthy (directory names, et al.),
* and argv[1] starting with "-s".
+ * caveat: some shells might allow argv elements to be arbitrarily long.
*/
void
prscore(argc, argv)
choose_windows(s)
const char *s;
{
- register int i;
+ int i;
+ char *tmps = 0;
for (i = 0; winchoices[i].procs; i++) {
if ('+' == winchoices[i].procs->name[0])
windowprocs.win_wait_synch = def_wait_synch;
if (!winchoices[0].procs) {
- raw_printf("No window types?");
+ raw_printf("No window types supported?");
nh_terminate(EXIT_FAILURE);
}
+ /* 50: arbitrary, no real window_type names are anywhere near that long;
+ used to prevent potential raw_printf() overflow if user supplies a
+ very long string (on the order of 1200 chars) on the command line
+ (config file options can't get that big; they're truncated at 1023) */
+#define WINDOW_TYPE_MAXLEN 50
+ if (strlen(s) >= WINDOW_TYPE_MAXLEN) {
+ tmps = (char *) alloc(WINDOW_TYPE_MAXLEN);
+ (void) strncpy(tmps, s, WINDOW_TYPE_MAXLEN - 1);
+ tmps[WINDOW_TYPE_MAXLEN - 1] = '\0';
+ s = tmps;
+ }
+#undef WINDOW_TYPE_MAXLEN
+
if (!winchoices[1].procs) {
config_error_add(
"Window type %s not recognized. The only choice is: %s",
config_error_add("Window type %s not recognized. Choices are: %s",
s, buf);
}
+ if (tmps)
+ free((genericptr_t) tmps) /*, tmps = 0*/ ;
if (windowprocs.win_raw_print == def_raw_print
|| WINDOWPORT("safe-startup"))
return 0;
}
+/* caveat: argv elements might be arbitrary long */
static void
process_options(argc, argv)
int argc;
load_symset("DECGraphics", PRIMARY);
switch_symbols(TRUE);
} else {
- raw_printf("Unknown option: %s", *argv);
+ raw_printf("Unknown option: %.60s", *argv);
}
break;
case 'X':
-
discover = TRUE, wizard = FALSE;
break;
#ifdef NEWS
load_symset("RogueIBM", ROGUESET);
switch_symbols(TRUE);
} else {
- raw_printf("Unknown option: %s", *argv);
+ raw_printf("Unknown option: %.60s", *argv);
}
break;
case 'p': /* profession (role) */
flags.initrole = i;
break;
}
- /* else raw_printf("Unknown option: %s", *argv); */
+ /* else raw_printf("Unknown option: %.60s", *argv); */
}
}