about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlexander Barton <alex@barton.de>2014-01-15 14:58:57 +0100
committerAlexander Barton <alex@barton.de>2014-01-15 14:58:57 +0100
commite73d70ce6fab3acdefe914520a4296acb6d50eac (patch)
tree1db6827a5a4541f0a6b87e43c2071191e3b19cdf /src
parent2560e5f1560b6b4a225e77de67876a588543c53d (diff)
downloadngircd-e73d70ce6fab3acdefe914520a4296acb6d50eac.tar.gz
ngircd-e73d70ce6fab3acdefe914520a4296acb6d50eac.zip
Remove "range matching" functionality
Don't support "range marching" in our pattern matching code using
the "[...]" syntax, because [ and ] are valid characters in nick
names and one has to quote them currently using the "\" character,
which is quite unexpected. For example:

  Nick "te[st" => "MODE #channel +b te\[st"

And remove quoting altogether, too, because "*" and "?" don't need
to be quoted because these characters are not allowed in IRC masks,
nicks, and hostnames.

Reported by "hifi" (Toni Spets) on IRC, thanks!
Diffstat (limited to 'src')
-rw-r--r--src/ngircd/match.c118
1 files changed, 1 insertions, 117 deletions
diff --git a/src/ngircd/match.c b/src/ngircd/match.c
index dad3e7bc..bc26e755 100644
--- a/src/ngircd/match.c
+++ b/src/ngircd/match.c
@@ -109,11 +109,6 @@ MatchCaseInsensitiveList(const char *Pattern, const char *String,
 static int
 Matche( const char *p, const char *t )
 {
-	register char range_start, range_end;
-	bool invert;
-	bool member_match;
-	bool loop;
-
 	for( ; *p; p++, t++ )
 	{
 		/* if this is the end of the text then this is the end of the match */
@@ -131,118 +126,7 @@ Matche( const char *p, const char *t )
 			case '*':	/* multiple any character match */
 				return Matche_After_Star( p, t );
 
-			case '[':	/* [..] construct, single member/exclusion character match */
-				/* move to beginning of range */
-				p++;
-
-				/* check if this is a member match or exclusion match */
-				invert = false;
-				if( *p == '!' || *p == '^' )
-				{
-					invert = true;
-					p++;
-				}
-
-				/* if closing bracket here or at range start then we have a malformed pattern */
-				if ( *p == ']' ) return MATCH_PATTERN;
-
-				member_match = false;
-				loop = true;
-
-				while( loop )
-				{
-					/* if end of construct then loop is done */
-					if( *p == ']' )
-					{
-						loop = false;
-						continue;
-					}
-
-					/* matching a '!', '^', '-', '\' or a ']' */
-					if( *p == '\\' ) range_start = range_end = *++p;
-					else  range_start = range_end = *p;
-
-					/* if end of pattern then bad pattern (Missing ']') */
-					if( ! *p ) return MATCH_PATTERN;
-
-					/* check for range bar */
-					if( *++p == '-' )
-					{
-						/* get the range end */
-						range_end = *++p;
-
-						/* if end of pattern or construct then bad pattern */
-						if( range_end == '\0' || range_end == ']' ) return MATCH_PATTERN;
-
-						/* special character range end */
-						if( range_end == '\\' )
-						{
-							range_end = *++p;
-
-							/* if end of text then we have a bad pattern */
-							if ( ! range_end ) return MATCH_PATTERN;
-						}
-
-						/* move just beyond this range */
-						p++;
-					}
-
-					/* if the text character is in range then match found. make sure the range
-					 * letters have the proper relationship to one another before comparison */
-					if( range_start < range_end )
-					{
-						if( *t >= range_start && *t <= range_end )
-						{
-							member_match = true;
-							loop = false;
-						}
-					}
-					else
-					{
-						if( *t >= range_end && *t <= range_start )
-						{
-							member_match = true;
-							loop = false;
-						}
-					}
-				}
-
-				/* if there was a match in an exclusion set then no match */
-				/* if there was no match in a member set then no match */
-				if(( invert && member_match ) || ! ( invert || member_match )) return MATCH_RANGE;
-
-				/* if this is not an exclusion then skip the rest of the [...]
-				 * construct that already matched. */
-				if( member_match )
-				{
-					while( *p != ']' )
-					{
-						/* bad pattern (Missing ']') */
-						if( ! *p ) return MATCH_PATTERN;
-
-						/* skip exact match */
-						if( *p == '\\' )
-						{
-							p++;
-
-							/* if end of text then we have a bad pattern */
-							if( ! *p ) return MATCH_PATTERN;
-						}
-
-						/* move to next pattern char */
-						p++;
-					}
-				}
-				break;
-			case '\\':	/* next character is quoted and must match exactly */
-				/* move pattern pointer to quoted char and fall through */
-				p++;
-
-				/* if end of text then we have a bad pattern */
-				if( ! *p ) return MATCH_PATTERN;
-
-				/* must match this character exactly */
-			default:
+			default:	/* must match this character exactly */
 				if( *p != *t ) return MATCH_LITERAL;
 		}
 	}