diff options
Diffstat (limited to 'core/tcp_wrappers/03_all_wildcard.patch')
-rw-r--r-- | core/tcp_wrappers/03_all_wildcard.patch | 93 |
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 */ ++ |