From 054a74d3781ee31e7ceea7fe1ba543808b5b7c24 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 22 Oct 2006 05:59:26 +0000 Subject: [PATCH] yn_function (trunk only) Explicitly truncate the query prompt string to QBUFSZ-1 characters. For tty and Amiga, no longer include the choices and default within that length limit; use a bigger buffer to hold them along with the prompt. [See cvs log for doc/window.doc for more details.] --- sys/amiga/winami.c | 13 ++++++++----- sys/wince/mswproc.c | 7 +++++-- win/Qt/qt_win.cpp | 7 +++++-- win/X11/winX.c | 18 +++++++++++------- win/gnome/gnbind.c | 7 +++++-- win/tty/topl.c | 13 +++++++++---- win/win32/mswproc.c | 7 +++++-- 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/sys/amiga/winami.c b/sys/amiga/winami.c index 9b7d4130f..b5caa6854 100644 --- a/sys/amiga/winami.c +++ b/sys/amiga/winami.c @@ -1094,7 +1094,7 @@ char def; register char q; char rtmp[40]; boolean digit_ok, allow_num; - char prompt[QBUFSZ]; + char prompt[BUFSZ]; register struct amii_WinDesc *cw; if( cw = amii_wins[ WIN_MESSAGE ] ) @@ -1102,13 +1102,16 @@ char def; if (resp) { char *rb, respbuf[QBUFSZ]; - allow_num = (index(resp, '#') != 0); + allow_num = (index(resp, '#') != 0); Strcpy(respbuf, resp); /* any acceptable responses that follow aren't displayed */ if ((rb = index(respbuf, '\033')) != 0) *rb = '\0'; - Sprintf(prompt, "%s [%s] ", query, respbuf); - if (def) Sprintf(eos(prompt), "(%c) ", def); - pline("%s", prompt); + (void)strncpy(prompt, query, QBUFSZ-1); + prompt[QBUFSZ-1] = '\0'; + Sprintf(eos(prompt), " [%s]", respbuf); + if (def) Sprintf(eos(prompt), " (%c)", def); + Strcat(prompt, " "); + pline("%s", prompt); } else { amii_putstr(WIN_MESSAGE, 0, query); cursor_on(WIN_MESSAGE); diff --git a/sys/wince/mswproc.c b/sys/wince/mswproc.c index 3192277fe..d1a9f71ac 100644 --- a/sys/wince/mswproc.c +++ b/sys/wince/mswproc.c @@ -1392,8 +1392,11 @@ char mswin_yn_function(const char *question, const char *choices, /* anything beyond is hidden */ *cb = '\0'; } - sprintf(message, "%s [%s] ", question, choicebuf); - if (def) sprintf(eos(message), "(%c) ", def); + (void)strncpy(message, question, QBUFSZ-1); + message[QBUFSZ-1] = '\0'; + sprintf(eos(message), " [%s]", choicebuf); + if (def) sprintf(eos(message), " (%c)", def); + Strcat(message, " "); /* escape maps to 'q' or 'n' or default, in that order */ yn_esc_map = (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def)); diff --git a/win/Qt/qt_win.cpp b/win/Qt/qt_win.cpp index db2caac6e..7d49bfa91 100644 --- a/win/Qt/qt_win.cpp +++ b/win/Qt/qt_win.cpp @@ -4963,8 +4963,11 @@ char NetHackQtBind::qt_yn_function(const char *question, const char *choices, CH // anything beyond is hidden *cb = '\0'; } - Sprintf(message, "%s [%s] ", question, choicebuf); - if (def) Sprintf(eos(message), "(%c) ", def); + (void)strncpy(message, question, QBUFSZ-1); + message[QBUFSZ-1] = '\0'; + Sprintf(eos(message), " [%s]", choicebuf); + if (def) Sprintf(eos(message), " (%c)", def); + Strcat(message, " "); // escape maps to 'q' or 'n' or default, in that order yn_esc_map = (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def)); diff --git a/win/X11/winX.c b/win/X11/winX.c index 3186e57fc..81890c1dd 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -1669,7 +1669,7 @@ X11_yn_function(ques, choices, def) char def; { static Boolean need_to_init = True; - char buf[QBUFSZ]; + char buf[BUFSZ]; Arg args[4]; Cardinal num_args; @@ -1692,19 +1692,23 @@ X11_yn_function(ques, choices, def) Strcpy(choicebuf, choices); /* anything beyond is hidden */ if ((cb = index(choicebuf, '\033')) != 0) *cb = '\0'; /* ques [choices] (def) */ - if ((int)(1 + strlen(ques) + 2 + strlen(choicebuf) + 4) >= QBUFSZ) - panic("yn_function: question too long"); - Sprintf(buf, "%s [%s] ", ques, choicebuf); - if (def) Sprintf(eos(buf), "(%c) ", def); + if ((int)(1 + strlen(ques) + 2 + strlen(choicebuf) + 4) >= BUFSZ) + panic("X11_yn_function: question too long"); + (void)strncpy(buf, ques, QBUFSZ-1); + buf[QBUFSZ-1] = '\0'; + Sprintf(eos(buf), " [%s]", choicebuf); + if (def) Sprintf(eos(buf), " (%c)", def); + Strcat(buf, " "); /* escape maps to 'q' or 'n' or default, in that order */ yn_esc_map = (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def)); } else { - if ((int)(1 + strlen(ques)) >= QBUFSZ) - panic("yn_function: question too long"); + if ((int)(1 + strlen(ques) + 1) >= BUFSZ) + panic("X11_yn_function: question too long"); Strcpy(buf, ques); + Strcat(buf, " "); } if (!appResources.slow && need_to_init) { diff --git a/win/gnome/gnbind.c b/win/gnome/gnbind.c index 76fb5bfe0..dd4ef55e5 100644 --- a/win/gnome/gnbind.c +++ b/win/gnome/gnbind.c @@ -1050,8 +1050,11 @@ char gnome_yn_function(const char *question, const char *choices, /* anything beyond is hidden */ *cb = '\0'; } - sprintf(message, "%s [%s] ", question, choicebuf); - if (def) sprintf(eos(message), "(%c) ", def); + (void)strncpy(message, question, QBUFSZ-1); + message[QBUFSZ-1] = '\0'; + sprintf(eos(message), " [%s]", choicebuf); + if (def) sprintf(eos(message), " (%c)", def); + Strcat(message, " "); /* escape maps to 'q' or 'n' or default, in that order */ yn_esc_map = (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def)); diff --git a/win/tty/topl.c b/win/tty/topl.c index 4f8135b37..b69a258c2 100644 --- a/win/tty/topl.c +++ b/win/tty/topl.c @@ -425,9 +425,9 @@ char def; boolean digit_ok, allow_num; struct WinDesc *cw = wins[WIN_MESSAGE]; boolean doprev = 0; - char prompt[QBUFSZ]; + char prompt[BUFSZ]; #ifdef UNICODE_WIDEWINPORT - nhwchar wprompt[QBUFSZ]; + nhwchar wprompt[BUFSZ]; #endif if(ttyDisplay->toplin == 1 && !(cw->flags & WIN_STOP)) more(); @@ -441,8 +441,13 @@ char def; Strcpy(respbuf, resp); /* any acceptable responses that follow aren't displayed */ if ((rb = index(respbuf, '\033')) != 0) *rb = '\0'; - Sprintf(prompt, "%s [%s] ", query, respbuf); - if (def) Sprintf(eos(prompt), "(%c) ", def); + (void)strncpy(prompt, query, QBUFSZ-1); + prompt[QBUFSZ-1] = '\0'; + Sprintf(eos(prompt), " [%s]", respbuf); + if (def) Sprintf(eos(prompt), " (%c)", def); + /* not pline("%s ", prompt); + trailing space is wanted here in case of reprompt */ + Strcat(prompt, " "); pline("%s", prompt); } else { pline("%s ", query); diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index 9afe383f1..dc2c5c35b 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -1447,8 +1447,11 @@ char mswin_yn_function(const char *question, const char *choices, /* anything beyond is hidden */ *cb = '\0'; } - sprintf(message, "%s [%s] ", question, choicebuf); - if (def) sprintf(eos(message), "(%c) ", def); + (void)strncpy(message, question, QBUFSZ-1); + message[QBUFSZ-1] = '\0'; + sprintf(eos(message), " [%s]", choicebuf); + if (def) sprintf(eos(message), " (%c)", def); + Strcat(message, " "); /* escape maps to 'q' or 'n' or default, in that order */ yn_esc_map = (index(choices, 'q') ? 'q' : (index(choices, 'n') ? 'n' : def));