From: "J. Bruce Fields" <bfields@fieldses.org>
To: Hemmo Nieminen <hemmo.nieminen@iki.fi>
Cc: linux-nfs@vger.kernel.org, steved@redhat.com,
Chuck Lever <chuck.lever@oracle.com>
Subject: Re: [nfs-utils PATCH] Binding a privileged port in rpc.statd.
Date: Thu, 10 Jan 2013 10:25:37 -0500 [thread overview]
Message-ID: <20130110152537.GD15401@fieldses.org> (raw)
In-Reply-To: <20130110142710.GA2544@fcku.lan>
On Thu, Jan 10, 2013 at 04:27:10PM +0200, Hemmo Nieminen wrote:
> Hi,
>
> It seems that rpc.statd will fail to bind to a (free) port, if
> the first port it receives is listed in /etc/services. The
> bindresvport will keep on returning the same port if we close
> the socket too early.
>
> The attached patch should fix this.
Looks right to me.--b.
>
> --
> Hemmo
> >From abdaa0c27d66c71c9500b983fc4366cb3e514fff Mon Sep 17 00:00:00 2001
> From: Hemmo Nieminen <hemmo.nieminen@iki.fi>
> Date: Thu, 3 Jan 2013 10:00:17 +0200
> Subject: [PATCH] Fix socket binding loop.
>
> Instead of closing the sockets before requesting a new one, keep them
> open until a suitable one is found. Otherwise bindresvport will return
> the same port over and over again.
> ---
> utils/statd/rmtcall.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c
> index 4ecb03c..fd576d9 100644
> --- a/utils/statd/rmtcall.c
> +++ b/utils/statd/rmtcall.c
> @@ -68,21 +68,19 @@ statd_get_socket(void)
> {
> struct sockaddr_in sin;
> struct servent *se;
> - int loopcnt = 100;
> + const int loopcnt = 100;
> + int i, tmp_sockets[loopcnt];
>
> if (sockfd >= 0)
> return sockfd;
>
> - while (loopcnt-- > 0) {
> -
> - if (sockfd >= 0) close(sockfd);
> + for (i = 0; i < loopcnt; ++i) {
>
> if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
> xlog(L_ERROR, "%s: Can't create socket: %m", __func__);
> - return -1;
> + break;
> }
>
> -
> memset(&sin, 0, sizeof(sin));
> sin.sin_family = AF_INET;
> sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
> @@ -96,7 +94,16 @@ statd_get_socket(void)
> if (se == NULL)
> break;
> /* rather not use that port, try again */
> +
> + tmp_sockets[i] = sockfd;
> }
> +
> + while (--i >= 0)
> + close(tmp_sockets[i]);
> +
> + if (sockfd < 0)
> + return -1;
> +
> FD_SET(sockfd, &SVC_FDSET);
> return sockfd;
> }
> --
> 1.8.1
>
next prev parent reply other threads:[~2013-01-10 15:25 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-10 14:27 [nfs-utils PATCH] Binding a privileged port in rpc.statd Hemmo Nieminen
2013-01-10 15:25 ` J. Bruce Fields [this message]
2013-01-16 20:40 ` Steve Dickson
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=20130110152537.GD15401@fieldses.org \
--to=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=hemmo.nieminen@iki.fi \
--cc=linux-nfs@vger.kernel.org \
--cc=steved@redhat.com \
/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.