Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 130701790bf2d95e902edf16031ff596 > files > 124

autofs-5.0.1-0.rc2.164.el5_8.src.rpm

diff --git a/CHANGELOG b/CHANGELOG
index 1d12402..989b7cb 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -45,6 +45,7 @@
   check for "port=" parameter.
 - correct semantics of "-null" map handling.
 - remove ability to use multiple indirect mount entries in master map.
+- expand export access checks to include missing syntax options.
 
 1/9/2006 autofs-5.0.1 rc2
 -------------------------
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 342d33a..4982457 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -44,6 +44,8 @@ #endif
 
 #define MAX_ERR_BUF	512
 
+static char *ypdomain = NULL;
+
 /*
  * Create a UDP RPC client
  */
@@ -910,51 +912,62 @@ static int pattern_match(const char *s, 
 
 static int string_match(const char *myname, const char *pattern)
 {
-	struct hostent he;
-	struct hostent *phe = &he;
-	struct hostent *result;
-	char buf[HOST_ENT_BUF_SIZE];
-	int ret, ghn_errno;
+	struct addrinfo hints, *ni;
+	int ret;
 
-	memset(buf, 0, HOST_ENT_BUF_SIZE);
-	memset(&he, 0, sizeof(struct hostent));
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_flags = AI_CANONNAME;
+	hints.ai_family = 0;
+	hints.ai_socktype = 0;
 
-	ret = gethostbyname_r(myname, phe,
-			buf, HOST_ENT_BUF_SIZE, &result, &ghn_errno);
-	if (ret || !result)
+	ret = getaddrinfo(myname, NULL, &hints, &ni);
+	if (ret) {
+		error(LOGOPT_ANY, "name lookup failed: %s", gai_strerror(ret));
 		return 0;
+	}
 
 	if (strchr(pattern, '*') || strchr(pattern, '?')) {
 		ret = pattern_match(myname, pattern);
 		if (!ret)
-			ret = pattern_match(phe->h_name, pattern);
+			ret = pattern_match(ni->ai_canonname, pattern);
 	} else {
-		if (strchr(pattern, '.'))
-			ret = !memcmp(phe->h_name, pattern, strlen(pattern));
-		else
-			ret = !memcmp(myname, pattern, strlen(pattern));
+		/* Match simple nane or FQDN */
+		ret = !memcmp(myname, pattern, strlen(pattern));
+		if (!ret)
+			ret = !memcmp(ni->ai_canonname, pattern, strlen(pattern));
+
+		/* Name could still be a netgroup (Solaris) */
+		if (!ret && ypdomain) {
+			ret = innetgr(pattern, myname, NULL, ypdomain);
+			if (!ret)
+				ret = innetgr(pattern,
+					 ni->ai_canonname, NULL, ypdomain);
+		}
+
 	}
+	freeaddrinfo(ni);
 	return ret;
 }
 
 static int host_match(char *pattern)
 {
-	static char *ypdomain = NULL;
-	static char myname[MAXHOSTNAMELEN + 1] = "\0";
+	unsigned int negate = (*pattern == '-');
+	const char *m_pattern = (negate ? pattern + 1 : pattern);
+	char myname[MAXHOSTNAMELEN + 1] = "\0";
 	struct in_addr tmp;
 	int ret = 0;
 
-	if (!*myname)
-		if (gethostname(myname, MAXHOSTNAMELEN))
-			return 0;
+	if (gethostname(myname, MAXHOSTNAMELEN))
+		return 0;
 
-	if (*pattern == '@') {
-		if (!ypdomain)
-			if (yp_get_default_domain(&ypdomain))
-				return 0;
-		ret = innetgr(pattern + 1, myname, (char *) 0, ypdomain);
-	} else if (inet_aton(pattern, &tmp) || strchr(pattern, '/')) {
-		size_t len = strlen(pattern) + 1;
+	if (yp_get_default_domain(&ypdomain))
+		ypdomain = NULL;
+
+	if (*m_pattern == '@') {
+		if (ypdomain)
+			ret = innetgr(m_pattern + 1, myname, NULL, ypdomain);
+	} else if (inet_aton(m_pattern, &tmp) || strchr(m_pattern, '/')) {
+		size_t len = strlen(m_pattern) + 1;
 		char *addr, *mask;
 
 		addr = alloca(len);
@@ -962,18 +975,21 @@ static int host_match(char *pattern)
 			return 0;
 
 		memset(addr, 0, len);
-		memcpy(addr, pattern, len - 1);
+		memcpy(addr, m_pattern, len - 1);
 		mask = strchr(addr, '/');
 		if (mask) {
 			*mask++ = '\0';
 			ret = masked_match(addr, mask);
 		} else
 			ret = masked_match(addr, "32");
-	} else if (!strcmp(pattern, "gss/krb5")) {
+	} else if (!strcmp(m_pattern, "gss/krb5")) {
 		/* Leave this to the GSS layer */
 		ret = 1;
 	} else
-		ret = string_match(myname, pattern);
+		ret = string_match(myname, m_pattern);
+
+	if (negate)
+		ret = !ret;
 
 	return ret;
 }