=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-string.c,v retrieving revision 1.29 retrieving revision 1.30 diff -c -r1.29 -r1.30 *** src/usr.bin/tmux/Attic/cmd-string.c 2017/06/14 07:42:41 1.29 --- src/usr.bin/tmux/Attic/cmd-string.c 2018/08/19 19:03:46 1.30 *************** *** 1,4 **** ! /* $OpenBSD: cmd-string.c,v 1.29 2017/06/14 07:42:41 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-string.c,v 1.30 2018/08/19 19:03:46 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 54,59 **** --- 54,75 ---- (*p)--; } + static int + cmd_string_unicode(wchar_t *wc, const char *s, size_t *p, char ch) + { + int size = (ch == 'u') ? 4 : 8; + u_int tmp; + + if (size == 4 && sscanf(s + *p, "%4x", &tmp) != 1) + return (-1); + if (size == 8 && sscanf(s + *p, "%8x", &tmp) != 1) + return (-1); + *p += size; + + *wc = (wchar_t)tmp; + return (0); + } + int cmd_string_split(const char *s, int *rargc, char ***rargv) { *************** *** 191,203 **** static char * cmd_string_string(const char *s, size_t *p, char endch, int esc) { ! int ch; ! char *buf, *t; ! size_t len; - buf = NULL; - len = 0; - while ((ch = cmd_string_getc(s, p)) != endch) { switch (ch) { case EOF: --- 207,218 ---- static char * cmd_string_string(const char *s, size_t *p, char endch, int esc) { ! int ch; ! wchar_t wc; ! struct utf8_data ud; ! char *buf = NULL, *t; ! size_t len = 0; while ((ch = cmd_string_getc(s, p)) != endch) { switch (ch) { case EOF: *************** *** 220,225 **** --- 235,252 ---- case 't': ch = '\t'; break; + case 'u': + case 'U': + if (cmd_string_unicode(&wc, s, p, ch) != 0) + goto error; + if (utf8_split(wc, &ud) != UTF8_DONE) + goto error; + if (len >= SIZE_MAX - ud.size - 1) + goto error; + buf = xrealloc(buf, len + ud.size); + memcpy(buf + len, ud.data, ud.size); + len += ud.size; + continue; } break; case '$':