Unhelpful error message when matching hosts in access list [PATCH]

Thorild Selen thorild at Update.UU.SE
Sat Jul 5 09:08:59 EST 2003


Greetings,

As previously reported by me to the Debian bug tracking system:

----------------------------------------------------------------------

An access list in rsyncd.conf may contain hostnames as well as
addresses. It may contain several patterns to match against.
address_match (in access.c) does this by trying to match hostname and
address against each of the patterns until a match is found or there
are no more patterns.

1. For each failed hostname match, an address (non-hostname) match is
   also attempted. If the pattern isn't a valid address (maybe because
   it is a hostname that didn't match the pattern) the less helpful
   error message "malformed address <foo>" is written to the log for
   every failed match. If hostname "baz" is matched against the
   pattern list "foo, bar, baz" this will give two confusing error
   messages "malformed address foo" "malformed address bar" in the
   log.

   Suggestion: If something looks like a hostname and not like an
   address (by some clever criterion), then this match either should
   not be done, or the confusing error message should not be printed.


2. The "malformed address" message is written whenever getaddrinfo()
   fails, ignoring the error code.

   Suggestion: Instead of

     rprintf(FERROR,"malformed address %s\n", tok);

   use gai_strerror(3) to get a more helpful error description:

     rprintf(FERROR,"error matching address %s: %s\n", tok, gai_strerror(gai));

----------------------------------------------------------------------

Below is a patch that fixes these bugs. Seems to work just fine.


Thorild Selén
Datorföreningen Update / Update Computer Club, Uppsala, SE


--- rsync-2.5.6/access.c	2003-01-20 14:46:28.000000000 +0100
+++ rsync/access.c	2003-07-04 23:59:01.000000000 +0200
@@ -93,7 +93,10 @@
 	if (p)
 		*p++ = '/';
 	if (gai) {
-		rprintf(FERROR,"malformed address %s\n", tok);
+		rprintf(FERROR,
+			"error matching address %s: %s\n",
+			tok,
+			gai_strerror(gai));
 		freeaddrinfo(resa);
 		return 0;
 	}
@@ -192,6 +195,18 @@
 	return ret;
 }
 
+/* Test if a string is likely to be an (IPv4 or IPv6) address */
+static int likely_address(char *s)
+{
+  size_t len = strlen(s);
+  
+  return ((strspn(s, ".0123456789") == len)
+#ifdef INET6
+	  || (strspn(s, ":0123456789ABCDEFabcdef") == len)
+#endif
+	  );
+}
+
 static int access_match(char *list, char *addr, char *host)
 {
 	char *tok;
@@ -203,7 +218,9 @@
 	if (host) strlower(host);
 
 	for (tok=strtok(list2," ,\t"); tok; tok=strtok(NULL," ,\t")) {
-		if (match_hostname(host, tok) || match_address(addr, tok)) {
+		if (match_hostname(host, tok)
+		    || (likely_address(tok)
+			&& match_address(addr, tok))) {
 			free(list2);
 			return 1;
 		}



More information about the rsync mailing list