@@ -108,21 +108,13 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
108108 llcp_sock -> service_name_len ,
109109 GFP_KERNEL );
110110 if (!llcp_sock -> service_name ) {
111- nfc_llcp_local_put (llcp_sock -> local );
112- llcp_sock -> local = NULL ;
113- llcp_sock -> dev = NULL ;
114111 ret = - ENOMEM ;
115- goto put_dev ;
112+ goto sock_llcp_put_local ;
116113 }
117114 llcp_sock -> ssap = nfc_llcp_get_sdp_ssap (local , llcp_sock );
118115 if (llcp_sock -> ssap == LLCP_SAP_MAX ) {
119- nfc_llcp_local_put (llcp_sock -> local );
120- llcp_sock -> local = NULL ;
121- kfree (llcp_sock -> service_name );
122- llcp_sock -> service_name = NULL ;
123- llcp_sock -> dev = NULL ;
124116 ret = - EADDRINUSE ;
125- goto put_dev ;
117+ goto free_service_name ;
126118 }
127119
128120 llcp_sock -> reserved_ssap = llcp_sock -> ssap ;
@@ -132,6 +124,19 @@ static int llcp_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
132124 pr_debug ("Socket bound to SAP %d\n" , llcp_sock -> ssap );
133125
134126 sk -> sk_state = LLCP_BOUND ;
127+ nfc_put_device (dev );
128+ release_sock (sk );
129+
130+ return 0 ;
131+
132+ free_service_name :
133+ kfree (llcp_sock -> service_name );
134+ llcp_sock -> service_name = NULL ;
135+
136+ sock_llcp_put_local :
137+ nfc_llcp_local_put (llcp_sock -> local );
138+ llcp_sock -> local = NULL ;
139+ llcp_sock -> dev = NULL ;
135140
136141put_dev :
137142 nfc_put_device (dev );
@@ -626,23 +631,16 @@ static int llcp_sock_release(struct socket *sock)
626631 }
627632 }
628633
629- if (llcp_sock -> reserved_ssap < LLCP_SAP_MAX )
630- nfc_llcp_put_ssap (llcp_sock -> local , llcp_sock -> ssap );
631-
632- release_sock (sk );
633-
634- /* Keep this sock alive and therefore do not remove it from the sockets
635- * list until the DISC PDU has been actually sent. Otherwise we would
636- * reply with DM PDUs before sending the DISC one.
637- */
638- if (sk -> sk_state == LLCP_DISCONNECTING )
639- return err ;
640-
641634 if (sock -> type == SOCK_RAW )
642635 nfc_llcp_sock_unlink (& local -> raw_sockets , sk );
643636 else
644637 nfc_llcp_sock_unlink (& local -> sockets , sk );
645638
639+ if (llcp_sock -> reserved_ssap < LLCP_SAP_MAX )
640+ nfc_llcp_put_ssap (llcp_sock -> local , llcp_sock -> ssap );
641+
642+ release_sock (sk );
643+
646644out :
647645 sock_orphan (sk );
648646 sock_put (sk );
@@ -712,10 +710,8 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
712710 llcp_sock -> local = nfc_llcp_local_get (local );
713711 llcp_sock -> ssap = nfc_llcp_get_local_ssap (local );
714712 if (llcp_sock -> ssap == LLCP_SAP_MAX ) {
715- nfc_llcp_local_put (llcp_sock -> local );
716- llcp_sock -> local = NULL ;
717713 ret = - ENOMEM ;
718- goto put_dev ;
714+ goto sock_llcp_put_local ;
719715 }
720716
721717 llcp_sock -> reserved_ssap = llcp_sock -> ssap ;
@@ -760,8 +756,11 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
760756
761757sock_llcp_release :
762758 nfc_llcp_put_ssap (local , llcp_sock -> ssap );
759+
760+ sock_llcp_put_local :
763761 nfc_llcp_local_put (llcp_sock -> local );
764762 llcp_sock -> local = NULL ;
763+ llcp_sock -> dev = NULL ;
765764
766765put_dev :
767766 nfc_put_device (dev );
0 commit comments