diff --git a/src/bin/termptyesc.c b/src/bin/termptyesc.c index 2b884715..b83fe1d0 100644 --- a/src/bin/termptyesc.c +++ b/src/bin/termptyesc.c @@ -1043,6 +1043,26 @@ unhandled: return cc - c; } +static int +_xterm_arg_get(Eina_Unicode **ptr) +{ + Eina_Unicode *b = *ptr; + int sum = 0; + + while (isdigit(*b)) + { + sum *= 10; + sum += *b - '0'; + b++; + } + if (*b != ';') + sum = -1; + else + b++; + *ptr = b; + return sum; +} + static int _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) { @@ -1050,6 +1070,7 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) Eina_Unicode buf[4096], *b; char *s; int len = 0; + int arg; cc = c; b = buf; @@ -1071,13 +1092,20 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) return cc - c; } *b = 0; + b = buf; if ((*cc == ST) || (*cc == BEL) || (*cc == '\\')) cc++; else return 0; - switch (buf[0]) + + arg = _xterm_arg_get(&b); + switch (arg) { - case '0': + case -1: + goto err; + case 0: // XXX: title + name - callback - s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); + if (!*b) + goto err; + s = eina_unicode_unicode_to_utf8(b, &len); if (ty->prop.title) eina_stringshare_del(ty->prop.title); if (ty->prop.icon) eina_stringshare_del(ty->prop.icon); if (s) @@ -1094,9 +1122,11 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) if (ty->cb.set_title.func) ty->cb.set_title.func(ty->cb.set_title.data); if (ty->cb.set_icon.func) ty->cb.set_icon.func(ty->cb.set_icon.data); break; - case '1': + case 1: + if (!*b) + goto err; // XXX: icon name - callback - s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); + s = eina_unicode_unicode_to_utf8(b, &len); if (ty->prop.icon) eina_stringshare_del(ty->prop.icon); if (s) { @@ -1109,9 +1139,11 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) } if (ty->cb.set_icon.func) ty->cb.set_icon.func(ty->cb.set_icon.data); break; - case '2': + case 2: + if (!*b) + goto err; // XXX: title - callback - s = eina_unicode_unicode_to_utf8(&(buf[2]), &len); + s = eina_unicode_unicode_to_utf8(b, &len); if (ty->prop.title) eina_stringshare_del(ty->prop.title); if (s) { @@ -1124,17 +1156,22 @@ _handle_esc_xterm(Termpty *ty, const Eina_Unicode *c, Eina_Unicode *ce) } if (ty->cb.set_title.func) ty->cb.set_title.func(ty->cb.set_title.data); break; - case '4': + case 4: + if (!*b) + goto err; // XXX: set palette entry. not supported. - DBG("set palette, not supported"); + WRN("set palette, not supported"); if ((cc - c) < 3) return 0; break; default: // many others - ERR("unhandled xterm esc '%c'", buf[0]); + ERR("unhandled xterm esc %d", arg); break; } return cc - c; +err: + ERR("invalid xterm sequence"); + return cc - c; } static int