hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
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)
....@@ -497,6 +492,12 @@
497492 int rc = -EOPNOTSUPP;
498493
499494 lock_sock(sk);
495
+ if (sock->state != SS_UNCONNECTED) {
496
+ rc = -EINVAL;
497
+ release_sock(sk);
498
+ return rc;
499
+ }
500
+
500501 if (sk->sk_state != TCP_LISTEN) {
501502 memset(&x25_sk(sk)->dest_addr, 0, X25_ADDR_LEN);
502503 sk->sk_max_ack_backlog = backlog;
....@@ -664,6 +665,12 @@
664665 sock_set_flag(sk, SOCK_DEAD);
665666 sock_set_flag(sk, SOCK_DESTROY);
666667 break;
668
+
669
+ case X25_STATE_5:
670
+ x25_write_internal(sk, X25_CLEAR_REQUEST);
671
+ x25_disconnect(sk, 0, 0, 0);
672
+ __x25_destroy_socket(sk);
673
+ goto out;
667674 }
668675
669676 sock_orphan(sk);
....@@ -902,7 +909,7 @@
902909 /* Now attach up the new socket */
903910 skb->sk = NULL;
904911 kfree_skb(skb);
905
- sk->sk_ack_backlog--;
912
+ sk_acceptq_removed(sk);
906913 newsock->state = SS_CONNECTED;
907914 rc = 0;
908915 out2:
....@@ -1066,6 +1073,8 @@
10661073 if (test_bit(X25_ACCPT_APPRV_FLAG, &makex25->flags)) {
10671074 x25_write_internal(make, X25_CALL_ACCEPTED);
10681075 makex25->state = X25_STATE_3;
1076
+ } else {
1077
+ makex25->state = X25_STATE_5;
10691078 }
10701079
10711080 /*
....@@ -1074,7 +1083,7 @@
10741083 skb_copy_from_linear_data(skb, makex25->calluserdata.cuddata, skb->len);
10751084 makex25->calluserdata.cudlength = skb->len;
10761085
1077
- sk->sk_ack_backlog++;
1086
+ sk_acceptq_added(sk);
10781087
10791088 x25_insert_socket(make);
10801089
....@@ -1405,18 +1414,6 @@
14051414 break;
14061415 }
14071416
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;
14201417 case SIOCGIFADDR:
14211418 case SIOCSIFADDR:
14221419 case SIOCGIFDSTADDR:
....@@ -1688,26 +1685,12 @@
16881685 unsigned long arg)
16891686 {
16901687 void __user *argp = compat_ptr(arg);
1691
- struct sock *sk = sock->sk;
1692
-
16931688 int rc = -ENOIOCTLCMD;
16941689
16951690 switch(cmd) {
16961691 case TIOCOUTQ:
16971692 case TIOCINQ:
16981693 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);
17111694 break;
17121695 case SIOCGIFADDR:
17131696 case SIOCSIFADDR:
....@@ -1772,6 +1755,7 @@
17721755 #ifdef CONFIG_COMPAT
17731756 .compat_ioctl = compat_x25_ioctl,
17741757 #endif
1758
+ .gettstamp = sock_gettstamp,
17751759 .listen = x25_listen,
17761760 .shutdown = sock_no_shutdown,
17771761 .setsockopt = x25_setsockopt,
....@@ -1797,10 +1781,15 @@
17971781
17981782 write_lock_bh(&x25_list_lock);
17991783
1800
- sk_for_each(s, &x25_list)
1801
- if (x25_sk(s)->neighbour == nb)
1784
+ sk_for_each(s, &x25_list) {
1785
+ if (x25_sk(s)->neighbour == nb) {
1786
+ write_unlock_bh(&x25_list_lock);
1787
+ lock_sock(s);
18021788 x25_disconnect(s, ENETUNREACH, 0, 0);
1803
-
1789
+ release_sock(s);
1790
+ write_lock_bh(&x25_list_lock);
1791
+ }
1792
+ }
18041793 write_unlock_bh(&x25_list_lock);
18051794
18061795 /* Remove any related forwards */