From 19b1279bb3322699c3669197aa96deeaa262ee5a Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Thu, 25 Jul 2013 12:21:22 -0300 Subject: getch2: Remove unused function, fix possible crash If we still haven't read the full key from the input but it's regardless a unique match in the database, we could receive a NULL keycode from keys_search (it's not a full match after all) and proceed to use it. Don't disable the keycode matching code if we don't have termcap as we can still match against the hardcoded sequences. --- osdep/getch2.c | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) (limited to 'osdep/getch2.c') diff --git a/osdep/getch2.c b/osdep/getch2.c index e5752ae235..c19a410252 100644 --- a/osdep/getch2.c +++ b/osdep/getch2.c @@ -134,16 +134,6 @@ static keycode_st *keys_search(char *buf, int buflen) { return NULL; } -static keycode_st *keys_get_by_cap(char *cap) { - for (int i = 0; i < getch2_keys.len; i++) { - keycode_st *st = &getch2_keys.map[i]; - - if (strcmp(cap, st->cap) == 0) - return st; - } - return NULL; -} - /* pushes only if there is no duplicate. important as we only consider keys if the matches are unique. */ static keycode_st* keys_push_once(char *p, int code) { @@ -374,29 +364,33 @@ bool getch2(struct input_ctx *input_ctx) switch (state) { case STATE_INITIAL: { -#ifdef HAVE_TERMCAP int match_count = keys_count_matches(&getch2_buf[0], getch2_len); if (match_count == 1) { keycode_st *st = keys_search(&getch2_buf[0], getch2_len); - mp_input_put_key(input_ctx, st->code); - walk_buf(st->len); + if (st) { + mp_input_put_key(input_ctx, st->code); + walk_buf(st->len); + } /* else this is still a partial (but unique) match */ + + continue; } else if (match_count > 1) { continue; /* need more bytes to disambiguate */ } else { -#endif - utf8_len = bstr_parse_utf8_code_length(c); - - if (utf8_len > 1) { - state = STATE_UTF8; - } else { - if (utf8_len == 1) - mp_input_put_key(input_ctx, c); - walk_buf(getch2_pos); - } -#ifdef HAVE_TERMCAP + /* backtrack, send as UTF-8 */ + getch2_pos = 0; + c = getch2_buf[0]; } -#endif + utf8_len = bstr_parse_utf8_code_length(c); + + if (utf8_len > 1) { + state = STATE_UTF8; + } else if (utf8_len == 1) { + mp_input_put_key(input_ctx, c); + walk_buf(1); + } else + walk_buf(getch2_pos); + break; } case STATE_UTF8: { -- cgit v1.2.3