summaryrefslogtreecommitdiff
path: root/core/tcp_wrappers/03_all_wildcard.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/tcp_wrappers/03_all_wildcard.patch')
-rw-r--r--core/tcp_wrappers/03_all_wildcard.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/core/tcp_wrappers/03_all_wildcard.patch b/core/tcp_wrappers/03_all_wildcard.patch
new file mode 100644
index 000000000..44eec476e
--- /dev/null
+++ b/core/tcp_wrappers/03_all_wildcard.patch
@@ -0,0 +1,93 @@
+--- /tmp/hosts_access.c 2003-08-03 22:18:00.000000000 +0000
++++ hosts_access.c 2003-08-03 22:39:44.000000000 +0000
+@@ -289,6 +289,17 @@
+ {
+ int n;
+
++#ifndef DISABLE_WILDCARD_MATCHING
++ if (strchr(tok, '*') || strchr(tok,'?')) { /* contains '*' or '?' */
++ /* we must convert the both to lowercase as match_pattern_ylo is case-sensitive */
++ for (n = 0; n < strlen(tok); n++)
++ tok[n] = isupper(tok[n]) ? tolower(tok[n]) : tok[n];
++ for (n = 0; n < strlen(string); n++)
++ string[n] = isupper(string[n]) ? tolower(string[n]) : string[n];
++ return (match_pattern_ylo(string,tok));
++ } else
++#endif
++
+ if (tok[0] == '.') { /* suffix */
+ n = strlen(string) - strlen(tok);
+ return (n > 0 && STR_EQ(tok, string + n));
+@@ -329,3 +340,72 @@
+ }
+ return ((addr & mask) == net);
+ }
++
++#ifndef DISABLE_WILDCARD_MATCHING
++/* Note: this feature has been adapted in a pretty straightforward way
++ from Tatu Ylonen's last SSH version under free license by
++ Pekka Savola <pekkas@netcore.fi>.
++
++ Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
++*/
++
++/* Returns true if the given string matches the pattern (which may contain
++ ? and * as wildcards), and zero if it does not match. */
++
++int match_pattern_ylo(const char *s, const char *pattern)
++{
++ while (1)
++ {
++ /* If at end of pattern, accept if also at end of string. */
++ if (!*pattern)
++ return !*s;
++
++ /* Process '*'. */
++ if (*pattern == '*')
++ {
++ /* Skip the asterisk. */
++ pattern++;
++
++ /* If at end of pattern, accept immediately. */
++ if (!*pattern)
++ return 1;
++
++ /* If next character in pattern is known, optimize. */
++ if (*pattern != '?' && *pattern != '*')
++ {
++ /* Look instances of the next character in pattern, and try
++ to match starting from those. */
++ for (; *s; s++)
++ if (*s == *pattern &&
++ match_pattern_ylo(s + 1, pattern + 1))
++ return 1;
++ /* Failed. */
++ return 0;
++ }
++
++ /* Move ahead one character at a time and try to match at each
++ position. */
++ for (; *s; s++)
++ if (match_pattern_ylo(s, pattern))
++ return 1;
++ /* Failed. */
++ return 0;
++ }
++
++ /* There must be at least one more character in the string. If we are
++ at the end, fail. */
++ if (!*s)
++ return 0;
++
++ /* Check if the next character of the string is acceptable. */
++ if (*pattern != '?' && *pattern != *s)
++ return 0;
++
++ /* Move to the next character, both in string and in pattern. */
++ s++;
++ pattern++;
++ }
++ /*NOTREACHED*/
++}
++#endif /* DISABLE_WILDCARD_MATCHING */
++