diff options
author | Diogo Franco (Kovensky) <diogomfranco@gmail.com> | 2013-07-25 12:21:22 -0300 |
---|---|---|
committer | Diogo Franco (Kovensky) <diogomfranco@gmail.com> | 2013-07-25 12:21:22 -0300 |
commit | 19b1279bb3322699c3669197aa96deeaa262ee5a (patch) | |
tree | bec92b8ea436d88161ba5e4f9b0e70f33c8e1fda | |
parent | 057467f6b33b9f7c942bd2327561b74e738285b7 (diff) | |
download | mpv-19b1279bb3322699c3669197aa96deeaa262ee5a.tar.bz2 mpv-19b1279bb3322699c3669197aa96deeaa262ee5a.tar.xz |
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.
-rw-r--r-- | osdep/getch2.c | 44 |
1 files changed, 19 insertions, 25 deletions
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: { |