]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/sctp/socket.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / net / sctp / socket.c
index f23ad913dc7a070407813b44acb500a5f7c148e9..1b5d669e30292a57ed57dd920d81be2a57f97b22 100644 (file)
@@ -235,8 +235,12 @@ static struct sctp_transport *sctp_addr_id2transport(struct sock *sk,
                                              sctp_assoc_t id)
 {
        struct sctp_association *addr_asoc = NULL, *id_asoc = NULL;
-       struct sctp_transport *transport;
+       struct sctp_af *af = sctp_get_af_specific(addr->ss_family);
        union sctp_addr *laddr = (union sctp_addr *)addr;
+       struct sctp_transport *transport;
+
+       if (!af || sctp_verify_addr(sk, laddr, af->sockaddr_len))
+               return NULL;
 
        addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep,
                                               laddr,
@@ -4392,10 +4396,7 @@ int sctp_transport_walk_start(struct rhashtable_iter *iter)
 {
        int err;
 
-       err = rhashtable_walk_init(&sctp_transport_hashtable, iter,
-                                  GFP_KERNEL);
-       if (err)
-               return err;
+       rhltable_walk_enter(&sctp_transport_hashtable, iter);
 
        err = rhashtable_walk_start(iter);
        if (err && err != -EAGAIN) {
@@ -4475,18 +4476,17 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
                                  const union sctp_addr *paddr, void *p)
 {
        struct sctp_transport *transport;
-       int err = -ENOENT;
+       int err;
 
        rcu_read_lock();
        transport = sctp_addrs_lookup_transport(net, laddr, paddr);
-       if (!transport || !sctp_transport_hold(transport))
-               goto out;
-
        rcu_read_unlock();
+       if (!transport)
+               return -ENOENT;
+
        err = cb(transport, p);
        sctp_transport_put(transport);
 
-out:
        return err;
 }
 EXPORT_SYMBOL_GPL(sctp_transport_lookup_process);
@@ -7426,7 +7426,8 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
                 */
                release_sock(sk);
                current_timeo = schedule_timeout(current_timeo);
-               BUG_ON(sk != asoc->base.sk);
+               if (sk != asoc->base.sk)
+                       goto do_error;
                lock_sock(sk);
 
                *timeo_p = current_timeo;