about summary refs log tree commit diff
path: root/sunrpc/bindrsvprt.c
diff options
context:
space:
mode:
authorPeng Haitao <penght@cn.fujitsu.com>2012-11-19 01:53:07 -0500
committerCarlos O'Donell <carlos@systemhalted.org>2012-11-19 02:05:12 -0500
commitf6da27e53695ad1cc0e2a9490358decbbfdff5e5 (patch)
treeee71c15d35def733fe7580fa7a5d3a2813ff1a2d /sunrpc/bindrsvprt.c
parent1f51ee9246b048d8966c36ddd2c26d7e0f927d83 (diff)
downloadglibc-f6da27e53695ad1cc0e2a9490358decbbfdff5e5.tar.gz
glibc-f6da27e53695ad1cc0e2a9490358decbbfdff5e5.tar.xz
glibc-f6da27e53695ad1cc0e2a9490358decbbfdff5e5.zip
bindresvport() uses two static variables port and startport which are not
protected. It is not safe when in multithread circumstance.

bindresvport() select a port number from the range 512 to 1023, when in
multithread circumstance, the port may be 1024. So the static variables will be
protected.

Signed-off-by: Peng Haitao <penght@cn.fujitsu.com>
Reviewed-by: Carlos O'Donell <carlos@systemhalted.org>
Diffstat (limited to 'sunrpc/bindrsvprt.c')
-rw-r--r--sunrpc/bindrsvprt.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c
index d493c9f23e..e6a1b0b0b3 100644
--- a/sunrpc/bindrsvprt.c
+++ b/sunrpc/bindrsvprt.c
@@ -35,6 +35,12 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <bits/libc-lock.h>
+
+/*
+ * Locks the static variables in this file.
+ */
+__libc_lock_define_initialized (static, lock);
 
 /*
  * Bind a socket to a privileged IP port
@@ -74,6 +80,9 @@ bindresvport (int sd, struct sockaddr_in *sin)
 
   int nports = ENDPORT - startport + 1;
   int endport = ENDPORT;
+
+  __libc_lock_lock (lock);
+
  again:
   for (i = 0; i < nports; ++i)
     {
@@ -94,6 +103,8 @@ bindresvport (int sd, struct sockaddr_in *sin)
       goto again;
     }
 
+  __libc_lock_unlock (lock);
+
   return res;
 }
 libc_hidden_def (bindresvport)