This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2] Make bindresvport() function to multithread-safe
- From: Peng Haitao <penght at cn dot fujitsu dot com>
- To: vapier at gentoo dot org
- Cc: libc-alpha at sourceware dot org
- Date: Wed, 19 Sep 2012 09:45:09 +0800
- Subject: [PATCH v2] Make bindresvport() function to multithread-safe
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>
---
ChangeLog | 4 ++++
sunrpc/bindrsvprt.c | 10 ++++++++++
2 files changed, 14 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index ffdcfc1..cb023ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-19 Peng Haitao <penght@cn.fujitsu.com>
+
+ * sunrpc/bindrsvprt.c: Add lock to protect static variable.
+
2012-09-18 Joseph Myers <joseph@codesourcery.com>
* sysdeps/wordsize-64/Makefile [$(subdir) = misc]
diff --git a/sunrpc/bindrsvprt.c b/sunrpc/bindrsvprt.c
index d493c9f..c0037cc 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,8 @@ 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 +102,8 @@ bindresvport (int sd, struct sockaddr_in *sin)
goto again;
}
+ __libc_lock_unlock (lock);
+
return res;
}
libc_hidden_def (bindresvport)
--
1.7.11.4