forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/net/x25/af_x25.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * X.25 Packet Layer release 002
34 *
....@@ -6,12 +7,6 @@
67 * screw up. It might even work.
78 *
89 * This code REQUIRES 2.1.15 or higher
9
- *
10
- * This module:
11
- * This module is free software; you can redistribute it and/or
12
- * modify it under the terms of the GNU General Public License
13
- * as published by the Free Software Foundation; either version
14
- * 2 of the License, or (at your option) any later version.
1510 *
1611 * History
1712 * X.25 001 Jonathan Naylor Started coding.
....@@ -436,7 +431,7 @@
436431 */
437432
438433 static int x25_setsockopt(struct socket *sock, int level, int optname,
439
- char __user *optval, unsigned int optlen)
434
+ sockptr_t optval, unsigned int optlen)
440435 {
441436 int opt;
442437 struct sock *sk = sock->sk;
....@@ -450,7 +445,7 @@
450445 goto out;
451446
452447 rc = -EFAULT;
453
- if (get_user(opt, (int __user *)optval))
448
+ if (copy_from_sockptr(&opt, optval, sizeof(int)))
454449 goto out;
455450
456451 if (opt)
....@@ -664,6 +659,12 @@
664659 sock_set_flag(sk, SOCK_DEAD);
665660 sock_set_flag(sk, SOCK_DESTROY);
666661 break;
662
+
663
+ case X25_STATE_5:
664
+ x25_write_internal(sk, X25_CLEAR_REQUEST);
665
+ x25_disconnect(sk, 0, 0, 0);
666
+ __x25_destroy_socket(sk);
667
+ goto out;
667668 }
668669
669670 sock_orphan(sk);
....@@ -902,7 +903,7 @@
902903 /* Now attach up the new socket */
903904 skb->sk = NULL;
904905 kfree_skb(skb);
905
- sk->sk_ack_backlog--;
906
+ sk_acceptq_removed(sk);
906907 newsock->state = SS_CONNECTED;
907908 rc = 0;
908909 out2:
....@@ -1066,6 +1067,8 @@
10661067 if (test_bit(X25_ACCPT_APPRV_FLAG, &makex25->flags)) {
10671068 x25_write_internal(make, X25_CALL_ACCEPTED);
10681069 makex25->state = X25_STATE_3;
1070
+ } else {
1071
+ makex25->state = X25_STATE_5;
10691072 }
10701073
10711074 /*
....@@ -1074,7 +1077,7 @@
10741077 skb_copy_from_linear_data(skb, makex25->calluserdata.cuddata, skb->len);
10751078 makex25->calluserdata.cudlength = skb->len;
10761079
1077
- sk->sk_ack_backlog++;
1080
+ sk_acceptq_added(sk);
10781081
10791082 x25_insert_socket(make);
10801083
....@@ -1405,18 +1408,6 @@
14051408 break;
14061409 }
14071410
1408
- case SIOCGSTAMP:
1409
- rc = -EINVAL;
1410
- if (sk)
1411
- rc = sock_get_timestamp(sk,
1412
- (struct timeval __user *)argp);
1413
- break;
1414
- case SIOCGSTAMPNS:
1415
- rc = -EINVAL;
1416
- if (sk)
1417
- rc = sock_get_timestampns(sk,
1418
- (struct timespec __user *)argp);
1419
- break;
14201411 case SIOCGIFADDR:
14211412 case SIOCSIFADDR:
14221413 case SIOCGIFDSTADDR:
....@@ -1688,26 +1679,12 @@
16881679 unsigned long arg)
16891680 {
16901681 void __user *argp = compat_ptr(arg);
1691
- struct sock *sk = sock->sk;
1692
-
16931682 int rc = -ENOIOCTLCMD;
16941683
16951684 switch(cmd) {
16961685 case TIOCOUTQ:
16971686 case TIOCINQ:
16981687 rc = x25_ioctl(sock, cmd, (unsigned long)argp);
1699
- break;
1700
- case SIOCGSTAMP:
1701
- rc = -EINVAL;
1702
- if (sk)
1703
- rc = compat_sock_get_timestamp(sk,
1704
- (struct timeval __user*)argp);
1705
- break;
1706
- case SIOCGSTAMPNS:
1707
- rc = -EINVAL;
1708
- if (sk)
1709
- rc = compat_sock_get_timestampns(sk,
1710
- (struct timespec __user*)argp);
17111688 break;
17121689 case SIOCGIFADDR:
17131690 case SIOCSIFADDR:
....@@ -1772,6 +1749,7 @@
17721749 #ifdef CONFIG_COMPAT
17731750 .compat_ioctl = compat_x25_ioctl,
17741751 #endif
1752
+ .gettstamp = sock_gettstamp,
17751753 .listen = x25_listen,
17761754 .shutdown = sock_no_shutdown,
17771755 .setsockopt = x25_setsockopt,
....@@ -1797,10 +1775,15 @@
17971775
17981776 write_lock_bh(&x25_list_lock);
17991777
1800
- sk_for_each(s, &x25_list)
1801
- if (x25_sk(s)->neighbour == nb)
1778
+ sk_for_each(s, &x25_list) {
1779
+ if (x25_sk(s)->neighbour == nb) {
1780
+ write_unlock_bh(&x25_list_lock);
1781
+ lock_sock(s);
18021782 x25_disconnect(s, ENETUNREACH, 0, 0);
1803
-
1783
+ release_sock(s);
1784
+ write_lock_bh(&x25_list_lock);
1785
+ }
1786
+ }
18041787 write_unlock_bh(&x25_list_lock);
18051788
18061789 /* Remove any related forwards */