about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--sunrpc/bindrsvprt.c9
2 files changed, 12 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index d12789f50e..05e2d6c75c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+	* sunrpc/bindrsvprt.c (bindresvport): Wrap around to startport
+	in the loop if port is bigger than endport, initially set to
+	ENDPORT.  When changing startport, set endport and port
+	appropriately.
+
 2005-11-21  Ulrich Drepper  <drepper@redhat.com>
 
 	* Makefile.in: Remove RCS ID line.
diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c
index f58d3b2a8b..023ae1723b 100644
--- a/sunrpc/bindrsvprt.c
+++ b/sunrpc/bindrsvprt.c
@@ -74,14 +74,13 @@ bindresvport (int sd, struct sockaddr_in *sin)
   int res = -1;
 
   int nports = ENDPORT - startport + 1;
+  int endport = ENDPORT;
  again:
   for (i = 0; i < nports; ++i)
     {
       sin->sin_port = htons (port++);
-      if (port > ENDPORT)
-	{
-	  port = startport;
-	}
+      if (port > endport)
+	port = startport;
       res = __bind (sd, sin, sizeof (struct sockaddr_in));
       if (res >= 0 || errno != EADDRINUSE)
 	break;
@@ -90,7 +89,9 @@ bindresvport (int sd, struct sockaddr_in *sin)
   if (i == nports && startport != LOWPORT)
     {
       startport = LOWPORT;
+      endport = STARTPORT - 1;
       nports = STARTPORT - LOWPORT;
+      port = LOWPORT + port % (STARTPORT - LOWPORT);
       goto again;
     }