All of lore.kernel.org
 help / color / mirror / Atom feed
From: Neil Brown <neilb@suse.de>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH] Fix IP address check in check_netgroup()
Date: Wed, 4 Aug 2010 10:29:13 +1000	[thread overview]
Message-ID: <20100804102913.207c1a4d@notabene> (raw)
In-Reply-To: <20100803191107.19326.19237.stgit-x+BlCsqV7M/wdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>

On Tue, 03 Aug 2010 15:13:06 -0400
Chuck Lever <chuck.lever@oracle.com> wrote:

> Neil Brown reports that recent changes to replace
> gethostby{addr,name}(3) with get{addr,info}name(3) may have
> inadvertently broken netgroup support.  There used to be a
> gethostbyaddr(3) call in the third paragraph in check_netgroup().
> 
> See http://marc.info/?l=linux-nfs&m=128084830214653&w=2 .
> 
> Introduced by commit 0509d3428f523776ddd9d6e9fa318587d3ec7d84.
> 
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Thanks Chuck - that look good, except .....


> ---
> 
> Compile-tested only.
> 
>  support/export/client.c |   37 ++++++++++++++++++++++++++++---------
>  1 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/support/export/client.c b/support/export/client.c
> index 91b17f3..0d34a55 100644
> --- a/support/export/client.c
> +++ b/support/export/client.c
> @@ -583,43 +583,62 @@ static int
>  check_netgroup(const nfs_client *clp, const struct addrinfo *ai)
>  {
>  	const char *netgroup = clp->m_hostname + 1;
> -	const char *hname = ai->ai_canonname;
>  	struct addrinfo *tmp = NULL;
>  	struct hostent *hp;
> +	char *dot, *hname;
>  	int i, match;
> -	char *dot;
> +
> +	match = 0;
> +
> +	hname = strdup(ai->ai_canonname);
> +	if (hname == NULL) {
> +		xlog(D_GENERAL, "%s: no memory for strdup", __func__);
> +		goto out;
> +	}
>  
>  	/* First, try to match the hostname without
>  	 * splitting off the domain */
> -	if (innetgr(netgroup, hname, NULL, NULL))
> -		return 1;
> +	if (innetgr(netgroup, hname, NULL, NULL)) {
> +		match = 1;
> +		goto out;
> +	}
>  
>  	/* See if hname aliases listed in /etc/hosts or nis[+]
>  	 * match the requested netgroup */
>  	hp = gethostbyname(hname);
>  	if (hp != NULL) {
>  		for (i = 0; hp->h_aliases[i]; i++)
> -			if (innetgr(netgroup, hp->h_aliases[i], NULL, NULL))
> -				return 1;
> +			if (innetgr(netgroup, hp->h_aliases[i], NULL, NULL)) {
> +				match = 1;
> +				goto out;
> +			}
>  	}
>  
>  	/* If hname is ip address convert to FQDN */
>  	tmp = host_pton(hname);
>  	if (tmp != NULL) {
> +		char *cname = host_canonname(tmp->ai_addr);
>  		freeaddrinfo(tmp);
> -		if (innetgr(netgroup, hname, NULL, NULL))
> -			return 1;
> +		if (cname != NULL) {
> +			hname = cname;

You need to "free(hname)" before assigning cname to it.
Also ...

> +			if (innetgr(netgroup, hname, NULL, NULL)) {
> +				match = 1;
> +				goto out;
> +			}
> +		}
>  	}
>  
>  	/* Okay, strip off the domain (if we have one) */
>  	dot = strchr(hname, '.');
>  	if (dot == NULL)
> -		return 0;
> +		goto out;
>  
>  	*dot = '\0';
>  	match = innetgr(netgroup, hname, NULL, NULL);
>  	*dot = '.';

It is fairly pointless to re-instate the '.' when we are about to free the
name.  Not a big issue, but I thought I would mention it.

With those provisos:
 Reviewed-By: NeilBrown <neilb@suse.de>

Thanks a lot!

NeilBrown

>  
> +out:
> +	free(hname);
>  	return match;
>  }
>  #else	/* !HAVE_INNETGR */
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


  parent reply	other threads:[~2010-08-04  0:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-03 19:13 [PATCH] Fix IP address check in check_netgroup() Chuck Lever
     [not found] ` <20100803191107.19326.19237.stgit-x+BlCsqV7M/wdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2010-08-04  0:29   ` Neil Brown [this message]
2010-08-04 14:58     ` Chuck Lever

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100804102913.207c1a4d@notabene \
    --to=neilb@suse.de \
    --cc=chuck.lever@oracle.com \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.