hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/nfc/llcp_sock.c
....@@ -1,18 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (C) 2011 Intel Corporation. All rights reserved.
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation; either version 2 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
164 */
175
186 #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
....@@ -111,7 +99,7 @@
11199 }
112100
113101 llcp_sock->dev = dev;
114
- llcp_sock->local = nfc_llcp_local_get(local);
102
+ llcp_sock->local = local;
115103 llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
116104 llcp_sock->service_name_len = min_t(unsigned int,
117105 llcp_addr.service_name_len,
....@@ -193,7 +181,7 @@
193181 }
194182
195183 llcp_sock->dev = dev;
196
- llcp_sock->local = nfc_llcp_local_get(local);
184
+ llcp_sock->local = local;
197185 llcp_sock->nfc_protocol = llcp_addr.nfc_protocol;
198186
199187 nfc_llcp_sock_link(&local->raw_sockets, sk);
....@@ -236,7 +224,7 @@
236224 }
237225
238226 static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname,
239
- char __user *optval, unsigned int optlen)
227
+ sockptr_t optval, unsigned int optlen)
240228 {
241229 struct sock *sk = sock->sk;
242230 struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk);
....@@ -259,7 +247,7 @@
259247 break;
260248 }
261249
262
- if (get_user(opt, (u32 __user *) optval)) {
250
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
263251 err = -EFAULT;
264252 break;
265253 }
....@@ -281,7 +269,7 @@
281269 break;
282270 }
283271
284
- if (get_user(opt, (u32 __user *) optval)) {
272
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
285273 err = -EFAULT;
286274 break;
287275 }
....@@ -710,24 +698,22 @@
710698 if (dev->dep_link_up == false) {
711699 ret = -ENOLINK;
712700 device_unlock(&dev->dev);
713
- goto put_dev;
701
+ goto sock_llcp_put_local;
714702 }
715703 device_unlock(&dev->dev);
716704
717705 if (local->rf_mode == NFC_RF_INITIATOR &&
718706 addr->target_idx != local->target_idx) {
719707 ret = -ENOLINK;
720
- goto put_dev;
708
+ goto sock_llcp_put_local;
721709 }
722710
723711 llcp_sock->dev = dev;
724
- llcp_sock->local = nfc_llcp_local_get(local);
712
+ llcp_sock->local = local;
725713 llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
726714 if (llcp_sock->ssap == LLCP_SAP_MAX) {
727
- nfc_llcp_local_put(llcp_sock->local);
728
- llcp_sock->local = NULL;
729715 ret = -ENOMEM;
730
- goto put_dev;
716
+ goto sock_llcp_nullify;
731717 }
732718
733719 llcp_sock->reserved_ssap = llcp_sock->ssap;
....@@ -743,6 +729,10 @@
743729 llcp_sock->service_name = kmemdup(addr->service_name,
744730 llcp_sock->service_name_len,
745731 GFP_KERNEL);
732
+ if (!llcp_sock->service_name) {
733
+ ret = -ENOMEM;
734
+ goto sock_llcp_release;
735
+ }
746736
747737 nfc_llcp_sock_link(&local->connecting_sockets, sk);
748738
....@@ -762,13 +752,19 @@
762752 return ret;
763753
764754 sock_unlink:
765
- nfc_llcp_put_ssap(local, llcp_sock->ssap);
766
- nfc_llcp_local_put(llcp_sock->local);
767
- llcp_sock->local = NULL;
768
-
769755 nfc_llcp_sock_unlink(&local->connecting_sockets, sk);
770756 kfree(llcp_sock->service_name);
771757 llcp_sock->service_name = NULL;
758
+
759
+sock_llcp_release:
760
+ nfc_llcp_put_ssap(local, llcp_sock->ssap);
761
+
762
+sock_llcp_nullify:
763
+ llcp_sock->local = NULL;
764
+ llcp_sock->dev = NULL;
765
+
766
+sock_llcp_put_local:
767
+ nfc_llcp_local_put(local);
772768
773769 put_dev:
774770 nfc_put_device(dev);
....@@ -949,8 +945,6 @@
949945 .ioctl = sock_no_ioctl,
950946 .listen = sock_no_listen,
951947 .shutdown = sock_no_shutdown,
952
- .setsockopt = sock_no_setsockopt,
953
- .getsockopt = sock_no_getsockopt,
954948 .sendmsg = sock_no_sendmsg,
955949 .recvmsg = llcp_sock_recvmsg,
956950 .mmap = sock_no_mmap,