From 280e26f17906c2c2fb39c33bee797e90f5cf0c40 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 11 Sep 2015 01:39:08 +0200 Subject: Fix sock_bind(sock,NULL) support * pflocal/sock.c (sock_bind): When addr is NULL, do not take/release its mutex. When old_addr is also NULL, return EINVAL. When old_addr is not NULL, deref old_addr instead of addr. --- pflocal/sock.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'pflocal') diff --git a/pflocal/sock.c b/pflocal/sock.c index 8076dd36a..ef70d2c83 100644 --- a/pflocal/sock.c +++ b/pflocal/sock.c @@ -277,12 +277,15 @@ sock_bind (struct sock *sock, struct addr *addr) error_t err = 0; struct addr *old_addr; - pthread_mutex_lock (&addr->lock); + if (addr) + pthread_mutex_lock (&addr->lock); pthread_mutex_lock (&sock->lock); old_addr = sock->addr; if (addr && old_addr) err = EINVAL; /* SOCK already bound. */ + else if (!addr && !old_addr) + err = EINVAL; /* SOCK already bound. */ else if (addr && addr->sock) err = EADDRINUSE; /* Something else already bound ADDR. */ else if (addr) @@ -303,13 +306,14 @@ sock_bind (struct sock *sock, struct addr *addr) /* Note that we don't have to worry about SOCK's ref count going to zero because whoever's calling us should be holding a ref. */ sock->refs--; - ports_port_deref_weak (addr); + ports_port_deref_weak (old_addr); assert (sock->refs > 0); /* But make sure... */ } } pthread_mutex_unlock (&sock->lock); - pthread_mutex_unlock (&addr->lock); + if (addr) + pthread_mutex_unlock (&addr->lock); return err; } -- cgit v1.2.3