summaryrefslogtreecommitdiff
path: root/bsd-bindresvport.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsd-bindresvport.c')
-rw-r--r--bsd-bindresvport.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/bsd-bindresvport.c b/bsd-bindresvport.c
index 04780673b..15bb667da 100644
--- a/bsd-bindresvport.c
+++ b/bsd-bindresvport.c
@@ -61,6 +61,7 @@ bindresvport_af(sd, sa, af)
61 struct sockaddr_in *sin; 61 struct sockaddr_in *sin;
62 struct sockaddr_in6 *sin6; 62 struct sockaddr_in6 *sin6;
63 u_int16_t *portp; 63 u_int16_t *portp;
64 u_int16_t port;
64 int salen; 65 int salen;
65 int i; 66 int i;
66 67
@@ -83,10 +84,13 @@ bindresvport_af(sd, sa, af)
83 } 84 }
84 sa->sa_family = af; 85 sa->sa_family = af;
85 86
86 if (*portp == 0) 87 port = ntohs(*portp);
87 *portp = (u_int16_t)(arc4random() % NPORTS) + STARTPORT; 88 if (port == 0)
89 port = (arc4random() % NPORTS) + STARTPORT;
88 90
89 for(i = 0; i < NPORTS; i++) { 91 for(i = 0; i < NPORTS; i++) {
92 *portp = htons(port);
93
90 error = bind(sd, sa, salen); 94 error = bind(sd, sa, salen);
91 95
92 /* Terminate on success */ 96 /* Terminate on success */
@@ -97,7 +101,9 @@ bindresvport_af(sd, sa, af)
97 if ((error < 0) && !((errno == EADDRINUSE) || (errno == EINVAL))) 101 if ((error < 0) && !((errno == EADDRINUSE) || (errno == EINVAL)))
98 break; 102 break;
99 103
100 *portp = (i % NPORTS) + STARTPORT; 104 port++;
105 if (port > ENDPORT)
106 port = STARTPORT;
101 } 107 }
102 108
103 return (error); 109 return (error);