regcomp: limit comparison to C locale only
authorJohn Marino <draco@marino.st>
Fri, 31 Jul 2015 13:00:23 +0000 (15:00 +0200)
committerJohn Marino <draco@marino.st>
Fri, 31 Jul 2015 13:06:16 +0000 (15:06 +0200)
The regex code does not work with multibyte codesets like UTF-8.  In fact,
it doesn't even work with single-byte codesets like ISO-8859-1.  The
comparison blows up at index 128 (the range is 0 to UCHAR_MAX (255).

As a temporary workaround, all comparisons will be done in C locale
regardless of the environment setting.  The regex library needs to be
updated to handle all codesets.

lib/libc/regex/regcomp.c

index 413d53e..223b989 100644 (file)
  *     @(#)regcomp.c   8.5 (Berkeley) 3/20/94
  */
 
+/*
+ * This implementation currently only works with C locale
+ * It's definitely limited by UCHAR_MAX, but not even ISO-8859 charsets
+ * are working.  The forced changing of locale to C for the comparison
+ * is considered a workaround until a better solution is found.
+ */
+
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>
@@ -765,8 +772,9 @@ p_b_term(struct parse *p, cset *cs)
        char c;
        wint_t start, finish;
        wint_t i;
+       locale_t loc = &__xlocale_C_locale;  /* see note under license */
        struct xlocale_collate *table =
-               (struct xlocale_collate*)__get_locale()->components[XLC_COLLATE];
+               (struct xlocale_collate*)loc->components[XLC_COLLATE];
 
        /* classify what we've got */
        switch ((MORE()) ? PEEK() : '\0') {