summaryrefslogtreecommitdiff
path: root/net/sctp/socket.c
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2007-05-15 17:14:58 -0400
committerVladislav Yasevich <vxy@hera.kernel.org>2007-06-13 20:44:41 +0000
commit8b35805693e1915829355723537f99f1b8bc9cc0 (patch)
tree45676c16bb89e5665528ae9c51c325a47bbbd116 /net/sctp/socket.c
parentd570ee490fb18220262cfe41284d7aede797ed4f (diff)
downloadlwn-8b35805693e1915829355723537f99f1b8bc9cc0.tar.gz
lwn-8b35805693e1915829355723537f99f1b8bc9cc0.zip
[SCTP]: Allow unspecified port in sctp_bindx()
Allow sctp_bindx() to accept multiple address with unspecified port. In this case, all addresses inherit the first bound port. We still catch full mis-matches. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Acked-by: Sridhar Samudrala <sri@us.ibm.com>
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r--net/sctp/socket.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index d370c945a757..a5b6e559451e 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -333,12 +333,19 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
if (!sp->pf->bind_verify(sp, addr))
return -EADDRNOTAVAIL;
- /* We must either be unbound, or bind to the same port. */
- if (bp->port && (snum != bp->port)) {
- SCTP_DEBUG_PRINTK("sctp_do_bind:"
+ /* We must either be unbound, or bind to the same port.
+ * It's OK to allow 0 ports if we are already bound.
+ * We'll just inhert an already bound port in this case
+ */
+ if (bp->port) {
+ if (!snum)
+ snum = bp->port;
+ else if (snum != bp->port) {
+ SCTP_DEBUG_PRINTK("sctp_do_bind:"
" New port %d does not match existing port "
"%d.\n", snum, bp->port);
- return -EINVAL;
+ return -EINVAL;
+ }
}
if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))