|
@@ -182,12 +182,14 @@ static int ieee802154_sock_ioctl(struct socket *sock, unsigned int cmd,
|
|
static HLIST_HEAD(raw_head);
|
|
static HLIST_HEAD(raw_head);
|
|
static DEFINE_RWLOCK(raw_lock);
|
|
static DEFINE_RWLOCK(raw_lock);
|
|
|
|
|
|
-static void raw_hash(struct sock *sk)
|
|
|
|
|
|
+static int raw_hash(struct sock *sk)
|
|
{
|
|
{
|
|
write_lock_bh(&raw_lock);
|
|
write_lock_bh(&raw_lock);
|
|
sk_add_node(sk, &raw_head);
|
|
sk_add_node(sk, &raw_head);
|
|
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
|
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
|
write_unlock_bh(&raw_lock);
|
|
write_unlock_bh(&raw_lock);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void raw_unhash(struct sock *sk)
|
|
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);
|
|
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);
|
|
write_lock_bh(&dgram_lock);
|
|
sk_add_node(sk, &dgram_head);
|
|
sk_add_node(sk, &dgram_head);
|
|
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
|
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
|
write_unlock_bh(&dgram_lock);
|
|
write_unlock_bh(&dgram_lock);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void dgram_unhash(struct sock *sk)
|
|
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 */
|
|
/* Checksums on by default */
|
|
sock_set_flag(sk, SOCK_ZAPPED);
|
|
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) {
|
|
if (sk->sk_prot->init) {
|
|
rc = sk->sk_prot->init(sk);
|
|
rc = sk->sk_prot->init(sk);
|