summaryrefslogtreecommitdiff
path: root/regex
diff options
context:
space:
mode:
authorbar@mysql.com <>2004-12-09 15:56:19 +0400
committerbar@mysql.com <>2004-12-09 15:56:19 +0400
commitc735aaebfc85c3727d89a237eabfadeae5386481 (patch)
tree8b8b980eeaba8605d61c99b0939a5ff52c9a39f5 /regex
parent611abb882bc7c450aa9ab32c1a0f0a723916ee42 (diff)
downloadmariadb-git-c735aaebfc85c3727d89a237eabfadeae5386481.tar.gz
Bugs: #7111: server crashes when regexp is used
Diffstat (limited to 'regex')
-rw-r--r--regex/regcomp.c21
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);
}