]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/rmtcall.c
rpc.statd: Fix socket binding loop.
[nfs-utils.git] / utils / statd / rmtcall.c
index 0e52fe2b81b1f357637b0e824fe1d4da0cc3827f..fd576d9158b6fa54dd530147401056d9b6b4419d 100644 (file)
@@ -68,24 +68,22 @@ 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 = INADDR_ANY;
+               sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
 
                if (bindresvport(sockfd, &sin) < 0) {
                        xlog(D_GENERAL, "%s: can't bind to reserved port",
@@ -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;
 }