diff options
author | unknown <bar@mysql.com> | 2004-12-09 15:56:19 +0400 |
---|---|---|
committer | unknown <bar@mysql.com> | 2004-12-09 15:56:19 +0400 |
commit | 809ea73208ab3edd36cad744918a1d4d3785411a (patch) | |
tree | 8b8b980eeaba8605d61c99b0939a5ff52c9a39f5 /regex | |
parent | e539f5bd3f4e94ea27f6ea35c3502b67c22597f2 (diff) | |
download | mariadb-git-809ea73208ab3edd36cad744918a1d4d3785411a.tar.gz |
Bugs: #7111: server crashes when regexp is used
Diffstat (limited to 'regex')
-rw-r--r-- | regex/regcomp.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/regex/regcomp.c b/regex/regcomp.c index 5f0351c32aa..998b39379aa 100644 --- a/regex/regcomp.c +++ b/regex/regcomp.c @@ -860,11 +860,28 @@ othercase(charset,ch) CHARSET_INFO *charset; int ch; { + /* + In MySQL some multi-byte character sets + have 'ctype' array but don't have 'to_lower' + and 'to_upper' arrays. In this case we handle + only basic latin letters a..z and A..Z. + + If 'to_lower' and 'to_upper' arrays are empty in a character set, + then my_isalpha(cs, ch) should never return TRUE for characters + other than basic latin letters. Otherwise it should be + considered as a mistake in character set definition. + */ assert(my_isalpha(charset,ch)); if (my_isupper(charset,ch)) - return(my_tolower(charset,ch)); + { + return(charset->to_lower ? my_tolower(charset,ch) : + ch - 'A' + 'a'); + } else if (my_islower(charset,ch)) - return(my_toupper(charset,ch)); + { + return(charset->to_upper ? my_toupper(charset,ch) : + ch - 'a' + 'A'); + } else /* peculiar, but could happen */ return(ch); } |