summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tr/str.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/usr.bin/tr/str.c b/usr.bin/tr/str.c
index 1df43dc..7f5df8f 100644
--- a/usr.bin/tr/str.c
+++ b/usr.bin/tr/str.c
@@ -125,20 +125,25 @@ bracket(s)
switch (s->str[1]) {
case ':': /* "[:class:]" */
- if ((p = strstr(s->str + 2, ":]")) == NULL)
+ if ((p = strchr(s->str + 2, ']')) == NULL)
return (0);
- *p = '\0';
+ if (*(p - 1) != ':' || p - s->str < 4)
+ goto repeat;
+ *(p - 1) = '\0';
s->str += 2;
genclass(s);
- s->str = p + 2;
+ s->str = p + 1;
return (1);
case '=': /* "[=equiv=]" */
- if ((p = strstr(s->str + 2, "=]")) == NULL)
+ if ((p = strchr(s->str + 2, ']')) == NULL)
return (0);
+ if (*(p - 1) != '=' || p - s->str < 4)
+ goto repeat;
s->str += 2;
genequiv(s);
return (1);
default: /* "[\###*n]" or "[#*n]" */
+ repeat:
if ((p = strpbrk(s->str + 2, "*]")) == NULL)
return (0);
if (p[0] != '*' || index(p, ']') == NULL)
OpenPOWER on IntegriCloud