Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Mar 2002 17:26:24 +0000
From:      Mark Murray <mark@grondar.za>
To:        Anatole Shaw <Anatole@mindspring.com>
Cc:        freebsd-audit@FreeBSD.ORG
Subject:   Re: regex for tcpwrappers 
Message-ID:  <200203161726.g2GHQO0n011948@grimreaper.grondar.org>
In-Reply-To: <20020316101232.C65694@ouch.Oof.NET> ; from Anatole Shaw <Anatole@mindspring.com>  "Sat, 16 Mar 2002 10:12:32 GMT."
References:  <20020316101232.C65694@ouch.Oof.NET> 

next in thread | previous in thread | raw e-mail | index | archive | help
Hi

This looks good; but please submit it to the TCP_wrapper author.

You'll find him at www.porcupine.org (Wietse Venema).

Thanks!

M

> 
> --qDbXVdCdHGoSgWSk
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: inline
> 
> This is my patch that adds extended regular expressions to tcpwrappers.
> I wrote it so that I could permit selected cities from DialSprint.net, 
> which lumps the city, state and other information all into the third 
> level of DNS. For example, with this patch, the tcpwrappers token
> 	~^sdn-ar-...cthart....\.dialsprint\.net$
> will only match the DialSprint pool in Hartford, Connecticut. Pretty 
> useful I think. Any committers care to review?
> --Anatole Shaw
> 
> --qDbXVdCdHGoSgWSk
> Content-Type: text/plain; charset=us-ascii
> Content-Disposition: attachment; filename="tcpwrappers-regex.patch"
> 
> --- contrib/tcp_wrappers/hosts_access.c.orig	Tue Jul 18 08:34:54 2000
> +++ contrib/tcp_wrappers/hosts_access.c	Thu Mar 14 06:45:02 2002
> @@ -41,6 +41,7 @@
>  #include <errno.h>
>  #include <setjmp.h>
>  #include <string.h>
> +#include <regex.h>
>  #ifdef INET6
>  #include <netdb.h>
>  #endif
> @@ -93,6 +94,7 @@
>  static int host_match();
>  static int string_match();
>  static int masked_match();
> +static int regex_match();
>  #ifdef INET6
>  static int masked_match4();
>  static int masked_match6();
> @@ -336,6 +338,8 @@
>      if (tok[0] == '.') {			/* suffix */
>  	n = strlen(string) - strlen(tok);
>  	return (n > 0 && STR_EQ(tok, string + n));
> +    } else if (tok[0] == '~') {			/* regex */
> +        return (regex_match(tok+1, string));
>      } else if (STR_EQ(tok, "ALL")) {		/* all: match any */
>  	return (YES);
>      } else if (STR_EQ(tok, "KNOWN")) {		/* not unknown */
> @@ -378,6 +382,45 @@
>  #endif
>  	return (STR_EQ(tok, string));
>      }
> +}
> +
> +/* regex_match - match string against regular expression */
> +
> +static int regex_match(exp, string)
> +char   *exp;
> +char   *string;
> +{
> +    regex_t preg;
> +    int errn;
> +    char errstr[256];
> +
> +    if ( *exp == '\0' ) {
> +        tcpd_warn("null regular expression");
> +        return (NO);
> +    }
> +    errn = regcomp(&preg, exp, REG_EXTENDED | REG_ICASE | REG_NOSUB);
> +    if ( errn != 0 ) {
> +        regerror(errn, &preg, errstr, 256);
> +        regfree(&preg);
> +        tcpd_warn("error in regex: %s", errstr);
> +        return (NO);
> +    }
> +    errn = regexec(&preg, string, 0, NULL, 0);
> +    if ( errn == 0 ) {
> +        regfree(&preg);
> +        return (YES);
> +    } else if ( errn == REG_NOMATCH ) {
> +        regfree(&preg);
> +        return (NO);
> +    } else {
> +        regerror(errn, &preg, errstr, 256);
> +        regfree(&preg);
> +        tcpd_warn("could not execute regex: %s", errstr);
> +        return (NO);
> +    }
> +    /* unreached */
> +    regfree(&preg);
> +    return (NO);
>  }
>  
>  /* masked_match - match address against netnumber/netmask */
> --- contrib/tcp_wrappers/hosts_access.5.orig	Thu Feb  3 10:26:57 2000
> +++ contrib/tcp_wrappers/hosts_access.5	Thu Mar 14 06:13:06 2002
> @@ -103,6 +103,15 @@
>  zero or more lines with zero or more host name or address patterns
>  separated by whitespace.  A file name pattern can be used anywhere
>  a host name or address pattern can be used.
> +.IP \(bu
> +A string that begins with a `~\' character.
> +The address (and hostname, if available) are matched
> +against the extended regular expression (see \fIre_format(7)\fR)
> +which follows the `~\' character.
> +For example, the pattern `~^nyc[0-9]+\\.example\\.com$\' matches the host name
> +`nyc23.example.com\' but neither `nyc.example.com\' nor `nyc42.example.com.au\'.
> +The comparison is not case-sensitive, and it is both impossible and useless
> +for spaces to appear in the expression.
>  .SH WILDCARDS
>  The access control language supports explicit wildcards:
>  .IP ALL
> 
> --qDbXVdCdHGoSgWSk--
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-audit" in the body of the message
-- 
o       Mark Murray
\_
O.\_    Warning: this .sig is umop ap!sdn

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203161726.g2GHQO0n011948>