Imported Upstream version 0.2.5
[platform/upstream/libtirpc.git] / src / bindresvport.c
index 6ce3e81..d6d9c14 100644 (file)
@@ -46,6 +46,9 @@
 #include <rpc/rpc.h>
 
 #include <string.h>
+#include <reentrant.h>
+
+extern pthread_mutex_t port_lock;
 
 /*
  * Bind a socket to a privileged IP port
@@ -80,16 +83,21 @@ bindresvport_sa(sd, sa)
        static u_int16_t port;
        static short startport = STARTPORT;
        socklen_t salen;
-       int nports = ENDPORT - startport + 1;
+       int nports;
        int endport = ENDPORT;
        int i;
 
+       mutex_lock(&port_lock);
+       nports = ENDPORT - startport + 1;
+
         if (sa == NULL) {
                 salen = sizeof(myaddr);
                 sa = (struct sockaddr *)&myaddr;
 
-                if (getsockname(sd, (struct sockaddr *)&myaddr, &salen) == -1)
-                        return -1;      /* errno is correctly set */
+                if (getsockname(sd, (struct sockaddr *)&myaddr, &salen) == -1) {
+                    mutex_unlock(&port_lock);
+                    return -1;      /* errno is correctly set */
+                }
 
                 af = myaddr.ss_family;
         } else
@@ -112,6 +120,7 @@ bindresvport_sa(sd, sa)
 #endif
         default:
                 errno = EPFNOSUPPORT;
+                mutex_unlock(&port_lock);
                 return (-1);
         }
         sa->sa_family = af;
@@ -137,6 +146,8 @@ bindresvport_sa(sd, sa)
            port = LOWPORT + port % (STARTPORT - LOWPORT);
            goto again;
        }
+       mutex_unlock(&port_lock);
+
         return (res);
 }
 #else