bin/150384: tr mis-parses '[=]=]' equivalence class

Richard Lowe richlowe at richlowe.net
Wed Sep 8 12:30:01 UTC 2010


>Number:         150384
>Category:       bin
>Synopsis:       tr mis-parses '[=]=]' equivalence class
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 08 12:30:00 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Richard Lowe
>Release:        CURRENT
>Organization:
>Environment:
N/A
>Description:
While working on porting the FreeBSD tr(1) to another system, we hit upon an issue reported by a user that tr didn't process '[=]=]' in the way they expected, that is:

  echo '[[[[]]]]' | tr -d '[=]=]'

Would print an empty string, rather than '[[[['

It seems that in bracket(), tr parses the above equivalence class as a character class, '[=]' followed by '=]', due to the call to strchr() finding the central ] when searching for a terminator then finding that the length of the class is less than 4, and punting on it.


>How-To-Repeat:
echo "[[[[]]]]" | tr -d '[=]=]'
Expecting '[[[['
>Fix:
A naive patch, causing bracket() to skip an extra character (that forming the equivalence class) before searching for the terminating ']', is attached.

Patch attached with submission follows:

diff -u /home/richlowe/str.c /tmp/buffer-content-1887OIZ
--- /home/richlowe/str.c	2010-09-08 08:13:18.000000000 -0400
+++ /tmp/buffer-content-1887OIZ	2010-09-08 08:17:36.000000000 -0400
@@ -156,7 +156,7 @@
 		s->str = p + 1;
 		return (1);
 	case '=':				/* "[=equiv=]" */
-		if ((p = strchr(s->str + 2, ']')) == NULL)
+		if ((p = strchr(s->str + 3, ']')) == NULL)
 			return (0);
 		if (*(p - 1) != '=' || p - s->str < 4)
 			goto repeat;

Diff finished.  Wed Sep  8 08:17:36 2010


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list