From Stefan Berger https://bugzilla.redhat.com/show_bug.cgi?id=677527 --- libnl-1.1/lib/socket.c +++ libnl-1.1/lib/socket.c @@ -89,6 +89,8 @@ * @{ */ +#include + #include #include #include @@ -117,12 +119,15 @@ static void __init init_default_cb(void) } static uint32_t used_ports_map[32]; +static pthread_mutex_t port_map_mutex = PTHREAD_MUTEX_INITIALIZER; static uint32_t generate_local_port(void) { int i, n; uint32_t pid = getpid() & 0x3FFFFF; + pthread_mutex_lock(&port_map_mutex); + for (i = 0; i < 32; i++) { if (used_ports_map[i] == 0xFFFFFFFF) continue; @@ -136,11 +141,15 @@ static uint32_t generate_local_port(void /* PID_MAX_LIMIT is currently at 2^22, leaving 10 bit * to, i.e. 1024 unique ports per application. */ - return pid + (n << 22); + pthread_mutex_unlock(&port_map_mutex); + + return pid + (n << 22); } } + pthread_mutex_unlock(&port_map_mutex); + /* Out of sockets in our own PID namespace, what to do? FIXME */ return UINT_MAX; } @@ -153,7 +162,10 @@ static void release_local_port(uint32_t return; nr = port >> 22; - used_ports_map[nr / 32] &= ~(1 << (nr % 32)); + + pthread_mutex_lock(&port_map_mutex); + used_ports_map[nr / 32] &= ~(1 << (nr % 32)); + pthread_mutex_unlock(&port_map_mutex); } /** --- libnl-1.1/lib/Makefile +++ libnl-1.1/lib/Makefile @@ -53,7 +53,7 @@ all: $(MAKE) $(targets) $(OUT_SLIB): ../Makefile.opts $(OBJ) - $(CC) -shared -Wl,-soname,libnl.so.1 -o $(OUT_SLIB) $(OBJ) $(LIBNL_LIB) -lc + $(CC) -shared -Wl,-soname,libnl.so.1 -o $(OUT_SLIB) $(OBJ) $(LIBNL_LIB) -lc -lpthread rm -f $(LN1_SLIB) ; $(LN) -s $(OUT_SLIB) $(LN1_SLIB) rm -f $(LN_SLIB) ; $(LN) -s $(LN1_SLIB) $(LN_SLIB)