hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/net/ax25/af_ax25.c
....@@ -1,8 +1,5 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
2
- * This program is free software; you can redistribute it and/or modify
3
- * it under the terms of the GNU General Public License as published by
4
- * the Free Software Foundation; either version 2 of the License, or
5
- * (at your option) any later version.
63 *
74 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
85 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
....@@ -90,12 +87,23 @@
9087 ax25_for_each(s, &ax25_list) {
9188 if (s->ax25_dev == ax25_dev) {
9289 sk = s->sk;
90
+ if (!sk) {
91
+ spin_unlock_bh(&ax25_list_lock);
92
+ ax25_disconnect(s, ENETUNREACH);
93
+ s->ax25_dev = NULL;
94
+ spin_lock_bh(&ax25_list_lock);
95
+ goto again;
96
+ }
9397 sock_hold(sk);
9498 spin_unlock_bh(&ax25_list_lock);
9599 lock_sock(sk);
96
- s->ax25_dev = NULL;
97
- release_sock(sk);
98100 ax25_disconnect(s, ENETUNREACH);
101
+ s->ax25_dev = NULL;
102
+ if (sk->sk_socket) {
103
+ dev_put(ax25_dev->dev);
104
+ ax25_dev_put(ax25_dev);
105
+ }
106
+ release_sock(sk);
99107 spin_lock_bh(&ax25_list_lock);
100108 sock_put(sk);
101109 /* The entry could have been deleted from the
....@@ -361,21 +369,25 @@
361369 if (copy_from_user(&ax25_ctl, arg, sizeof(ax25_ctl)))
362370 return -EFAULT;
363371
364
- if ((ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr)) == NULL)
365
- return -ENODEV;
366
-
367372 if (ax25_ctl.digi_count > AX25_MAX_DIGIS)
368373 return -EINVAL;
369374
370375 if (ax25_ctl.arg > ULONG_MAX / HZ && ax25_ctl.cmd != AX25_KILL)
371376 return -EINVAL;
372377
378
+ ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr);
379
+ if (!ax25_dev)
380
+ return -ENODEV;
381
+
373382 digi.ndigi = ax25_ctl.digi_count;
374383 for (k = 0; k < digi.ndigi; k++)
375384 digi.calls[k] = ax25_ctl.digi_addr[k];
376385
377
- if ((ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) == NULL)
386
+ ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev);
387
+ if (!ax25) {
388
+ ax25_dev_put(ax25_dev);
378389 return -ENOTCONN;
390
+ }
379391
380392 switch (ax25_ctl.cmd) {
381393 case AX25_KILL:
....@@ -442,6 +454,7 @@
442454 }
443455
444456 out_put:
457
+ ax25_dev_put(ax25_dev);
445458 ax25_cb_put(ax25);
446459 return ret;
447460
....@@ -536,13 +549,13 @@
536549 */
537550
538551 static int ax25_setsockopt(struct socket *sock, int level, int optname,
539
- char __user *optval, unsigned int optlen)
552
+ sockptr_t optval, unsigned int optlen)
540553 {
541554 struct sock *sk = sock->sk;
542555 ax25_cb *ax25;
543556 struct net_device *dev;
544557 char devname[IFNAMSIZ];
545
- unsigned long opt;
558
+ unsigned int opt;
546559 int res = 0;
547560
548561 if (level != SOL_AX25)
....@@ -551,7 +564,7 @@
551564 if (optlen < sizeof(unsigned int))
552565 return -EINVAL;
553566
554
- if (get_user(opt, (unsigned int __user *)optval))
567
+ if (copy_from_sockptr(&opt, optval, sizeof(unsigned int)))
555568 return -EFAULT;
556569
557570 lock_sock(sk);
....@@ -574,7 +587,7 @@
574587 break;
575588
576589 case AX25_T1:
577
- if (opt < 1 || opt > ULONG_MAX / HZ) {
590
+ if (opt < 1 || opt > UINT_MAX / HZ) {
578591 res = -EINVAL;
579592 break;
580593 }
....@@ -583,7 +596,7 @@
583596 break;
584597
585598 case AX25_T2:
586
- if (opt < 1 || opt > ULONG_MAX / HZ) {
599
+ if (opt < 1 || opt > UINT_MAX / HZ) {
587600 res = -EINVAL;
588601 break;
589602 }
....@@ -599,7 +612,7 @@
599612 break;
600613
601614 case AX25_T3:
602
- if (opt < 1 || opt > ULONG_MAX / HZ) {
615
+ if (opt < 1 || opt > UINT_MAX / HZ) {
603616 res = -EINVAL;
604617 break;
605618 }
....@@ -607,7 +620,7 @@
607620 break;
608621
609622 case AX25_IDLE:
610
- if (opt > ULONG_MAX / (60 * HZ)) {
623
+ if (opt > UINT_MAX / (60 * HZ)) {
611624 res = -EINVAL;
612625 break;
613626 }
....@@ -648,7 +661,7 @@
648661
649662 memset(devname, 0, sizeof(devname));
650663
651
- if (copy_from_user(devname, optval, optlen)) {
664
+ if (copy_from_sockptr(devname, optval, optlen)) {
652665 res = -EFAULT;
653666 break;
654667 }
....@@ -818,7 +831,7 @@
818831 struct sock *sk;
819832 ax25_cb *ax25;
820833
821
- if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
834
+ if (protocol < 0 || protocol > U8_MAX)
822835 return -EINVAL;
823836
824837 if (!net_eq(net, &init_net))
....@@ -967,14 +980,16 @@
967980 {
968981 struct sock *sk = sock->sk;
969982 ax25_cb *ax25;
983
+ ax25_dev *ax25_dev;
970984
971985 if (sk == NULL)
972986 return 0;
973987
974988 sock_hold(sk);
975
- sock_orphan(sk);
976989 lock_sock(sk);
990
+ sock_orphan(sk);
977991 ax25 = sk_to_ax25(sk);
992
+ ax25_dev = ax25->ax25_dev;
978993
979994 if (sk->sk_type == SOCK_SEQPACKET) {
980995 switch (ax25->state) {
....@@ -1035,6 +1050,15 @@
10351050 sk->sk_shutdown |= SEND_SHUTDOWN;
10361051 sk->sk_state_change(sk);
10371052 ax25_destroy_socket(ax25);
1053
+ }
1054
+ if (ax25_dev) {
1055
+ del_timer_sync(&ax25->timer);
1056
+ del_timer_sync(&ax25->t1timer);
1057
+ del_timer_sync(&ax25->t2timer);
1058
+ del_timer_sync(&ax25->t3timer);
1059
+ del_timer_sync(&ax25->idletimer);
1060
+ dev_put(ax25_dev->dev);
1061
+ ax25_dev_put(ax25_dev);
10381062 }
10391063
10401064 sock->sk = NULL;
....@@ -1112,8 +1136,10 @@
11121136 }
11131137 }
11141138
1115
- if (ax25_dev != NULL)
1139
+ if (ax25_dev) {
11161140 ax25_fillin_cb(ax25, ax25_dev);
1141
+ dev_hold(ax25_dev->dev);
1142
+ }
11171143
11181144 done:
11191145 ax25_cb_add(ax25);
....@@ -1397,7 +1423,7 @@
13971423
13981424 /* Now attach up the new socket */
13991425 kfree_skb(skb);
1400
- sk->sk_ack_backlog--;
1426
+ sk_acceptq_removed(sk);
14011427 newsock->state = SS_CONNECTED;
14021428
14031429 out:
....@@ -1627,9 +1653,12 @@
16271653 int flags)
16281654 {
16291655 struct sock *sk = sock->sk;
1630
- struct sk_buff *skb;
1656
+ struct sk_buff *skb, *last;
1657
+ struct sk_buff_head *sk_queue;
16311658 int copied;
16321659 int err = 0;
1660
+ int off = 0;
1661
+ long timeo;
16331662
16341663 lock_sock(sk);
16351664 /*
....@@ -1641,11 +1670,29 @@
16411670 goto out;
16421671 }
16431672
1644
- /* Now we can treat all alike */
1645
- skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1646
- flags & MSG_DONTWAIT, &err);
1647
- if (skb == NULL)
1648
- goto out;
1673
+ /* We need support for non-blocking reads. */
1674
+ sk_queue = &sk->sk_receive_queue;
1675
+ skb = __skb_try_recv_datagram(sk, sk_queue, flags, &off, &err, &last);
1676
+ /* If no packet is available, release_sock(sk) and try again. */
1677
+ if (!skb) {
1678
+ if (err != -EAGAIN)
1679
+ goto out;
1680
+ release_sock(sk);
1681
+ timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
1682
+ while (timeo && !__skb_wait_for_more_packets(sk, sk_queue, &err,
1683
+ &timeo, last)) {
1684
+ skb = __skb_try_recv_datagram(sk, sk_queue, flags, &off,
1685
+ &err, &last);
1686
+ if (skb)
1687
+ break;
1688
+
1689
+ if (err != -EAGAIN)
1690
+ goto done;
1691
+ }
1692
+ if (!skb)
1693
+ goto done;
1694
+ lock_sock(sk);
1695
+ }
16491696
16501697 if (!sk_to_ax25(sk)->pidincl)
16511698 skb_pull(skb, 1); /* Remove PID */
....@@ -1692,6 +1739,7 @@
16921739 out:
16931740 release_sock(sk);
16941741
1742
+done:
16951743 return err;
16961744 }
16971745
....@@ -1728,14 +1776,6 @@
17281776 res = put_user(amount, (int __user *) argp);
17291777 break;
17301778 }
1731
-
1732
- case SIOCGSTAMP:
1733
- res = sock_get_timestamp(sk, argp);
1734
- break;
1735
-
1736
- case SIOCGSTAMPNS:
1737
- res = sock_get_timestampns(sk, argp);
1738
- break;
17391779
17401780 case SIOCAX25ADDUID: /* Add a uid to the uid/call map table */
17411781 case SIOCAX25DELUID: /* Delete a uid from the uid/call map table */
....@@ -1903,8 +1943,8 @@
19031943 * magic dev src_addr dest_addr,digi1,digi2,.. st vs vr va t1 t1 t2 t2 t3 t3 idle idle n2 n2 rtt window paclen Snd-Q Rcv-Q inode
19041944 */
19051945
1906
- seq_printf(seq, "%8.8lx %s %s%s ",
1907
- (long) ax25,
1946
+ seq_printf(seq, "%p %s %s%s ",
1947
+ ax25,
19081948 ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
19091949 ax2asc(buf, &ax25->source_addr),
19101950 ax25->iamdigi? "*":"");
....@@ -1965,6 +2005,7 @@
19652005 .getname = ax25_getname,
19662006 .poll = datagram_poll,
19672007 .ioctl = ax25_ioctl,
2008
+ .gettstamp = sock_gettstamp,
19682009 .listen = ax25_listen,
19692010 .shutdown = ax25_shutdown,
19702011 .setsockopt = ax25_setsockopt,