sock: struct proto hash function may error
[cascardo/linux.git] / net / ieee802154 / socket.c
index a548be2..e0bd013 100644 (file)
@@ -182,12 +182,14 @@ static int ieee802154_sock_ioctl(struct socket *sock, unsigned int cmd,
 static HLIST_HEAD(raw_head);
 static DEFINE_RWLOCK(raw_lock);
 
-static void raw_hash(struct sock *sk)
+static int raw_hash(struct sock *sk)
 {
        write_lock_bh(&raw_lock);
        sk_add_node(sk, &raw_head);
        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
        write_unlock_bh(&raw_lock);
+
+       return 0;
 }
 
 static void raw_unhash(struct sock *sk)
@@ -462,12 +464,14 @@ static inline struct dgram_sock *dgram_sk(const struct sock *sk)
        return container_of(sk, struct dgram_sock, sk);
 }
 
-static void dgram_hash(struct sock *sk)
+static int dgram_hash(struct sock *sk)
 {
        write_lock_bh(&dgram_lock);
        sk_add_node(sk, &dgram_head);
        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
        write_unlock_bh(&dgram_lock);
+
+       return 0;
 }
 
 static void dgram_unhash(struct sock *sk)
@@ -1026,8 +1030,13 @@ static int ieee802154_create(struct net *net, struct socket *sock,
        /* Checksums on by default */
        sock_set_flag(sk, SOCK_ZAPPED);
 
-       if (sk->sk_prot->hash)
-               sk->sk_prot->hash(sk);
+       if (sk->sk_prot->hash) {
+               rc = sk->sk_prot->hash(sk);
+               if (rc) {
+                       sk_common_release(sk);
+                       goto out;
+               }
+       }
 
        if (sk->sk_prot->init) {
                rc = sk->sk_prot->init(sk);