=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/key-string.c,v retrieving revision 1.61 retrieving revision 1.62 diff -c -r1.61 -r1.62 *** src/usr.bin/tmux/key-string.c 2020/05/25 18:57:25 1.61 --- src/usr.bin/tmux/key-string.c 2020/06/27 10:19:59 1.62 *************** *** 1,4 **** ! /* $OpenBSD: key-string.c,v 1.61 2020/05/25 18:57:25 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: key-string.c,v 1.62 2020/06/27 10:19:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 18,24 **** --- 18,26 ---- #include + #include #include + #include #include "tmux.h" *************** *** 163,175 **** key_string_lookup_string(const char *string) { static const char *other = "!#()+,-.0123456789:;<=>'\r\t"; ! key_code key; ! u_int u; ! key_code modifiers; ! struct utf8_data ud; ! u_int i; enum utf8_state more; utf8_char uc; /* Is this no key or any key? */ if (strcasecmp(string, "None") == 0) --- 165,177 ---- key_string_lookup_string(const char *string) { static const char *other = "!#()+,-.0123456789:;<=>'\r\t"; ! key_code key, modifiers; ! u_int u, i; ! struct utf8_data ud, *udp; enum utf8_state more; utf8_char uc; + char m[MB_LEN_MAX + 1]; + int mlen; /* Is this no key or any key? */ if (strcasecmp(string, "None") == 0) *************** *** 181,189 **** if (string[0] == '0' && string[1] == 'x') { if (sscanf(string + 2, "%x", &u) != 1) return (KEYC_UNKNOWN); ! if (u > 0x1fffff) ! return (KEYC_UNKNOWN); ! return (u); } /* Check for modifiers. */ --- 183,203 ---- if (string[0] == '0' && string[1] == 'x') { if (sscanf(string + 2, "%x", &u) != 1) return (KEYC_UNKNOWN); ! mlen = wctomb(m, u); ! if (mlen <= 0 || mlen > MB_LEN_MAX) ! return (KEYC_UNKNOWN); ! m[mlen] = '\0'; ! ! udp = utf8_fromcstr(m); ! if (udp == NULL || ! udp[0].size == 0 || ! udp[1].size != 0 || ! utf8_from_data(&udp[0], &uc) != UTF8_DONE) { ! free(udp); ! return (KEYC_UNKNOWN); ! } ! free(udp); ! return (uc); } /* Check for modifiers. */