=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/key-string.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -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 +1,4 @@ -/* $OpenBSD: key-string.c,v 1.61 2020/05/25 18:57:25 nicm Exp $ */ +/* $OpenBSD: key-string.c,v 1.62 2020/06/27 10:19:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -18,7 +18,9 @@ #include +#include #include +#include #include "tmux.h" @@ -163,13 +165,13 @@ 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; + 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,9 +183,21 @@ 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); + 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. */