hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/net/nfc/llcp_core.c
....@@ -1,19 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (C) 2011 Intel Corporation. All rights reserved.
34 * Copyright (C) 2014 Marvell International Ltd.
4
- *
5
- * This program is free software; you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation; either version 2 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
175 */
186
197 #define pr_fmt(fmt) "llcp: %s: " fmt, __func__
....@@ -29,6 +17,8 @@
2917 static u8 llcp_magic[3] = {0x46, 0x66, 0x6d};
3018
3119 static LIST_HEAD(llcp_devices);
20
+/* Protects llcp_devices list */
21
+static DEFINE_SPINLOCK(llcp_devices_lock);
3222
3323 static void nfc_llcp_rx_skb(struct nfc_llcp_local *local, struct sk_buff *skb);
3424
....@@ -155,7 +145,7 @@
155145 write_unlock(&local->raw_sockets.lock);
156146 }
157147
158
-struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local)
148
+static struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local)
159149 {
160150 kref_get(&local->ref);
161151
....@@ -171,6 +161,7 @@
171161 cancel_work_sync(&local->rx_work);
172162 cancel_work_sync(&local->timeout_work);
173163 kfree_skb(local->rx_pending);
164
+ local->rx_pending = NULL;
174165 del_timer_sync(&local->sdreq_timer);
175166 cancel_work_sync(&local->sdreq_timeout_work);
176167 nfc_llcp_free_sdp_tlv_list(&local->pending_sdreqs);
....@@ -182,7 +173,6 @@
182173
183174 local = container_of(ref, struct nfc_llcp_local, ref);
184175
185
- list_del(&local->list);
186176 local_cleanup(local);
187177 kfree(local);
188178 }
....@@ -295,12 +285,33 @@
295285 struct nfc_llcp_local *nfc_llcp_find_local(struct nfc_dev *dev)
296286 {
297287 struct nfc_llcp_local *local;
288
+ struct nfc_llcp_local *res = NULL;
298289
290
+ spin_lock(&llcp_devices_lock);
299291 list_for_each_entry(local, &llcp_devices, list)
300
- if (local->dev == dev)
301
- return local;
292
+ if (local->dev == dev) {
293
+ res = nfc_llcp_local_get(local);
294
+ break;
295
+ }
296
+ spin_unlock(&llcp_devices_lock);
302297
303
- pr_debug("No device found\n");
298
+ return res;
299
+}
300
+
301
+static struct nfc_llcp_local *nfc_llcp_remove_local(struct nfc_dev *dev)
302
+{
303
+ struct nfc_llcp_local *local, *tmp;
304
+
305
+ spin_lock(&llcp_devices_lock);
306
+ list_for_each_entry_safe(local, tmp, &llcp_devices, list)
307
+ if (local->dev == dev) {
308
+ list_del(&local->list);
309
+ spin_unlock(&llcp_devices_lock);
310
+ return local;
311
+ }
312
+ spin_unlock(&llcp_devices_lock);
313
+
314
+ pr_warn("Shutting down device not found\n");
304315
305316 return NULL;
306317 }
....@@ -313,7 +324,7 @@
313324 "urn:nfc:sn:snep",
314325 };
315326
316
-static int nfc_llcp_wks_sap(char *service_name, size_t service_name_len)
327
+static int nfc_llcp_wks_sap(const char *service_name, size_t service_name_len)
317328 {
318329 int sap, num_wks;
319330
....@@ -337,7 +348,7 @@
337348
338349 static
339350 struct nfc_llcp_sock *nfc_llcp_sock_from_sn(struct nfc_llcp_local *local,
340
- u8 *sn, size_t sn_len)
351
+ const u8 *sn, size_t sn_len)
341352 {
342353 struct sock *sk;
343354 struct nfc_llcp_sock *llcp_sock, *tmp_sock;
....@@ -534,7 +545,7 @@
534545 {
535546 u8 *gb_cur, version, version_length;
536547 u8 lto_length, wks_length, miux_length;
537
- u8 *version_tlv = NULL, *lto_tlv = NULL,
548
+ const u8 *version_tlv = NULL, *lto_tlv = NULL,
538549 *wks_tlv = NULL, *miux_tlv = NULL;
539550 __be16 wks = cpu_to_be16(local->local_wks);
540551 u8 gb_len = 0;
....@@ -621,12 +632,15 @@
621632
622633 *general_bytes_len = local->gb_len;
623634
635
+ nfc_llcp_local_put(local);
636
+
624637 return local->gb;
625638 }
626639
627
-int nfc_llcp_set_remote_gb(struct nfc_dev *dev, u8 *gb, u8 gb_len)
640
+int nfc_llcp_set_remote_gb(struct nfc_dev *dev, const u8 *gb, u8 gb_len)
628641 {
629642 struct nfc_llcp_local *local;
643
+ int err;
630644
631645 if (gb_len < 3 || gb_len > NFC_MAX_GT_LEN)
632646 return -EINVAL;
....@@ -643,35 +657,39 @@
643657
644658 if (memcmp(local->remote_gb, llcp_magic, 3)) {
645659 pr_err("MAC does not support LLCP\n");
646
- return -EINVAL;
660
+ err = -EINVAL;
661
+ goto out;
647662 }
648663
649
- return nfc_llcp_parse_gb_tlv(local,
664
+ err = nfc_llcp_parse_gb_tlv(local,
650665 &local->remote_gb[3],
651666 local->remote_gb_len - 3);
667
+out:
668
+ nfc_llcp_local_put(local);
669
+ return err;
652670 }
653671
654
-static u8 nfc_llcp_dsap(struct sk_buff *pdu)
672
+static u8 nfc_llcp_dsap(const struct sk_buff *pdu)
655673 {
656674 return (pdu->data[0] & 0xfc) >> 2;
657675 }
658676
659
-static u8 nfc_llcp_ptype(struct sk_buff *pdu)
677
+static u8 nfc_llcp_ptype(const struct sk_buff *pdu)
660678 {
661679 return ((pdu->data[0] & 0x03) << 2) | ((pdu->data[1] & 0xc0) >> 6);
662680 }
663681
664
-static u8 nfc_llcp_ssap(struct sk_buff *pdu)
682
+static u8 nfc_llcp_ssap(const struct sk_buff *pdu)
665683 {
666684 return pdu->data[1] & 0x3f;
667685 }
668686
669
-static u8 nfc_llcp_ns(struct sk_buff *pdu)
687
+static u8 nfc_llcp_ns(const struct sk_buff *pdu)
670688 {
671689 return pdu->data[2] >> 4;
672690 }
673691
674
-static u8 nfc_llcp_nr(struct sk_buff *pdu)
692
+static u8 nfc_llcp_nr(const struct sk_buff *pdu)
675693 {
676694 return pdu->data[2] & 0xf;
677695 }
....@@ -813,7 +831,7 @@
813831 }
814832
815833 static struct nfc_llcp_sock *nfc_llcp_sock_get_sn(struct nfc_llcp_local *local,
816
- u8 *sn, size_t sn_len)
834
+ const u8 *sn, size_t sn_len)
817835 {
818836 struct nfc_llcp_sock *llcp_sock;
819837
....@@ -827,9 +845,10 @@
827845 return llcp_sock;
828846 }
829847
830
-static u8 *nfc_llcp_connect_sn(struct sk_buff *skb, size_t *sn_len)
848
+static const u8 *nfc_llcp_connect_sn(const struct sk_buff *skb, size_t *sn_len)
831849 {
832
- u8 *tlv = &skb->data[2], type, length;
850
+ u8 type, length;
851
+ const u8 *tlv = &skb->data[2];
833852 size_t tlv_array_len = skb->len - LLCP_HEADER_SIZE, offset = 0;
834853
835854 while (offset < tlv_array_len) {
....@@ -887,7 +906,7 @@
887906 }
888907
889908 static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
890
- struct sk_buff *skb)
909
+ const struct sk_buff *skb)
891910 {
892911 struct sock *new_sk, *parent;
893912 struct nfc_llcp_sock *sock, *new_sock;
....@@ -905,7 +924,7 @@
905924 goto fail;
906925 }
907926 } else {
908
- u8 *sn;
927
+ const u8 *sn;
909928 size_t sn_len;
910929
911930 sn = nfc_llcp_connect_sn(skb, &sn_len);
....@@ -1124,7 +1143,7 @@
11241143 }
11251144
11261145 static void nfc_llcp_recv_disc(struct nfc_llcp_local *local,
1127
- struct sk_buff *skb)
1146
+ const struct sk_buff *skb)
11281147 {
11291148 struct nfc_llcp_sock *llcp_sock;
11301149 struct sock *sk;
....@@ -1167,7 +1186,8 @@
11671186 nfc_llcp_sock_put(llcp_sock);
11681187 }
11691188
1170
-static void nfc_llcp_recv_cc(struct nfc_llcp_local *local, struct sk_buff *skb)
1189
+static void nfc_llcp_recv_cc(struct nfc_llcp_local *local,
1190
+ const struct sk_buff *skb)
11711191 {
11721192 struct nfc_llcp_sock *llcp_sock;
11731193 struct sock *sk;
....@@ -1200,7 +1220,8 @@
12001220 nfc_llcp_sock_put(llcp_sock);
12011221 }
12021222
1203
-static void nfc_llcp_recv_dm(struct nfc_llcp_local *local, struct sk_buff *skb)
1223
+static void nfc_llcp_recv_dm(struct nfc_llcp_local *local,
1224
+ const struct sk_buff *skb)
12041225 {
12051226 struct nfc_llcp_sock *llcp_sock;
12061227 struct sock *sk;
....@@ -1238,12 +1259,13 @@
12381259 }
12391260
12401261 static void nfc_llcp_recv_snl(struct nfc_llcp_local *local,
1241
- struct sk_buff *skb)
1262
+ const struct sk_buff *skb)
12421263 {
12431264 struct nfc_llcp_sock *llcp_sock;
1244
- u8 dsap, ssap, *tlv, type, length, tid, sap;
1265
+ u8 dsap, ssap, type, length, tid, sap;
1266
+ const u8 *tlv;
12451267 u16 tlv_len, offset;
1246
- char *service_name;
1268
+ const char *service_name;
12471269 size_t service_name_len;
12481270 struct nfc_llcp_sdp_tlv *sdp;
12491271 HLIST_HEAD(llc_sdres_list);
....@@ -1534,6 +1556,8 @@
15341556
15351557 __nfc_llcp_recv(local, skb);
15361558
1559
+ nfc_llcp_local_put(local);
1560
+
15371561 return 0;
15381562 }
15391563
....@@ -1550,6 +1574,8 @@
15501574
15511575 /* Close and purge all existing sockets */
15521576 nfc_llcp_socket_release(local, true, 0);
1577
+
1578
+ nfc_llcp_local_put(local);
15531579 }
15541580
15551581 void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx,
....@@ -1575,6 +1601,8 @@
15751601 mod_timer(&local->link_timer,
15761602 jiffies + msecs_to_jiffies(local->remote_lto));
15771603 }
1604
+
1605
+ nfc_llcp_local_put(local);
15781606 }
15791607
15801608 int nfc_llcp_register_device(struct nfc_dev *ndev)
....@@ -1618,14 +1646,16 @@
16181646 timer_setup(&local->sdreq_timer, nfc_llcp_sdreq_timer, 0);
16191647 INIT_WORK(&local->sdreq_timeout_work, nfc_llcp_sdreq_timeout_work);
16201648
1649
+ spin_lock(&llcp_devices_lock);
16211650 list_add(&local->list, &llcp_devices);
1651
+ spin_unlock(&llcp_devices_lock);
16221652
16231653 return 0;
16241654 }
16251655
16261656 void nfc_llcp_unregister_device(struct nfc_dev *dev)
16271657 {
1628
- struct nfc_llcp_local *local = nfc_llcp_find_local(dev);
1658
+ struct nfc_llcp_local *local = nfc_llcp_remove_local(dev);
16291659
16301660 if (local == NULL) {
16311661 pr_debug("No such device\n");