diff options
author | Vlad Yasevich <vladislav.yasevich@hp.com> | 2007-05-15 23:14:58 +0200 |
---|---|---|
committer | Vladislav Yasevich <vxy@hera.kernel.org> | 2007-06-13 22:44:41 +0200 |
commit | 8b35805693e1915829355723537f99f1b8bc9cc0 (patch) | |
tree | 45676c16bb89e5665528ae9c51c325a47bbbd116 /net | |
parent | [SCTP]: Correctly set daddr for IPv6 sockets during peeloff (diff) | |
download | linux-8b35805693e1915829355723537f99f1b8bc9cc0.tar.xz linux-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')
-rw-r--r-- | net/sctp/socket.c | 15 |
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)) |