No OOM in msg_show_console_dialog()

This commit is contained in:
Felipe Oliveira Carvalho
2014-05-28 23:21:24 -03:00
parent 3b648b0a7b
commit 3d10e2e0cb

View File

@@ -21,6 +21,7 @@
#include "nvim/eval.h"
#include "nvim/ex_eval.h"
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/getchar.h"
#include "nvim/mbyte.h"
#include "nvim/memory.h"
@@ -2710,51 +2711,49 @@ do_dialog (
++no_wait_return;
hotkeys = msg_show_console_dialog(message, buttons, dfltbutton);
if (hotkeys != NULL) {
for (;; ) {
/* Get a typed character directly from the user. */
c = get_keystroke();
switch (c) {
case CAR: /* User accepts default option */
case NL:
retval = dfltbutton;
break;
case Ctrl_C: /* User aborts/cancels */
case ESC:
retval = 0;
break;
default: /* Could be a hotkey? */
if (c < 0) /* special keys are ignored here */
continue;
if (c == ':' && ex_cmd) {
retval = dfltbutton;
ins_char_typebuf(':');
break;
}
/* Make the character lowercase, as chars in "hotkeys" are. */
c = vim_tolower(c);
retval = 1;
for (i = 0; hotkeys[i]; ++i) {
if (has_mbyte) {
if ((*mb_ptr2char)(hotkeys + i) == c)
break;
i += (*mb_ptr2len)(hotkeys + i) - 1;
} else if (hotkeys[i] == c)
break;
++retval;
}
if (hotkeys[i])
break;
/* No hotkey match, so keep waiting */
continue;
}
for (;; ) {
/* Get a typed character directly from the user. */
c = get_keystroke();
switch (c) {
case CAR: /* User accepts default option */
case NL:
retval = dfltbutton;
break;
}
case Ctrl_C: /* User aborts/cancels */
case ESC:
retval = 0;
break;
default: /* Could be a hotkey? */
if (c < 0) /* special keys are ignored here */
continue;
if (c == ':' && ex_cmd) {
retval = dfltbutton;
ins_char_typebuf(':');
break;
}
free(hotkeys);
/* Make the character lowercase, as chars in "hotkeys" are. */
c = vim_tolower(c);
retval = 1;
for (i = 0; hotkeys[i]; ++i) {
if (has_mbyte) {
if ((*mb_ptr2char)(hotkeys + i) == c)
break;
i += (*mb_ptr2len)(hotkeys + i) - 1;
} else if (hotkeys[i] == c)
break;
++retval;
}
if (hotkeys[i])
break;
/* No hotkey match, so keep waiting */
continue;
}
break;
}
free(hotkeys);
State = oldState;
setmouse();
--no_wait_return;
@@ -2871,6 +2870,7 @@ static char_u * console_dialog_alloc(const char_u *message,
* Returns an allocated string with hotkeys, or NULL for error.
*/
static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfltbutton)
FUNC_ATTR_NONNULL_RET
{
bool has_hotkey[HAS_HOTKEY_LEN];
char_u *hotk = console_dialog_alloc(message, buttons, has_hotkey);