diff options
| -rw-r--r-- | net/unix/af_unix.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index ab9048ac197f..e835da8fc091 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -599,15 +599,14 @@ static struct sock * unix_create1(struct net *net, struct socket *sock) | |||
| 599 | struct sock *sk = NULL; | 599 | struct sock *sk = NULL; |
| 600 | struct unix_sock *u; | 600 | struct unix_sock *u; |
| 601 | 601 | ||
| 602 | if (atomic_read(&unix_nr_socks) >= 2*get_max_files()) | 602 | atomic_inc(&unix_nr_socks); |
| 603 | if (atomic_read(&unix_nr_socks) > 2 * get_max_files()) | ||
| 603 | goto out; | 604 | goto out; |
| 604 | 605 | ||
| 605 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); | 606 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto); |
| 606 | if (!sk) | 607 | if (!sk) |
| 607 | goto out; | 608 | goto out; |
| 608 | 609 | ||
| 609 | atomic_inc(&unix_nr_socks); | ||
| 610 | |||
| 611 | sock_init_data(sock,sk); | 610 | sock_init_data(sock,sk); |
| 612 | lockdep_set_class(&sk->sk_receive_queue.lock, | 611 | lockdep_set_class(&sk->sk_receive_queue.lock, |
| 613 | &af_unix_sk_receive_queue_lock_key); | 612 | &af_unix_sk_receive_queue_lock_key); |
| @@ -625,6 +624,8 @@ static struct sock * unix_create1(struct net *net, struct socket *sock) | |||
| 625 | init_waitqueue_head(&u->peer_wait); | 624 | init_waitqueue_head(&u->peer_wait); |
| 626 | unix_insert_socket(unix_sockets_unbound, sk); | 625 | unix_insert_socket(unix_sockets_unbound, sk); |
| 627 | out: | 626 | out: |
| 627 | if (sk == NULL) | ||
| 628 | atomic_dec(&unix_nr_socks); | ||
| 628 | return sk; | 629 | return sk; |
| 629 | } | 630 | } |
| 630 | 631 | ||
