forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/net/rose/af_rose.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) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
85 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
....@@ -194,6 +191,7 @@
194191 rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
195192 if (rose->neighbour)
196193 rose->neighbour->use--;
194
+ dev_put(rose->device);
197195 rose->device = NULL;
198196 }
199197 }
....@@ -368,7 +366,7 @@
368366 */
369367
370368 static int rose_setsockopt(struct socket *sock, int level, int optname,
371
- char __user *optval, unsigned int optlen)
369
+ sockptr_t optval, unsigned int optlen)
372370 {
373371 struct sock *sk = sock->sk;
374372 struct rose_sock *rose = rose_sk(sk);
....@@ -380,7 +378,7 @@
380378 if (optlen < sizeof(int))
381379 return -EINVAL;
382380
383
- if (get_user(opt, (int __user *)optval))
381
+ if (copy_from_sockptr(&opt, optval, sizeof(int)))
384382 return -EFAULT;
385383
386384 switch (optname) {
....@@ -594,6 +592,8 @@
594592 rose->idle = orose->idle;
595593 rose->defer = orose->defer;
596594 rose->device = orose->device;
595
+ if (rose->device)
596
+ dev_hold(rose->device);
597597 rose->qbitincl = orose->qbitincl;
598598
599599 return sk;
....@@ -647,6 +647,7 @@
647647 break;
648648 }
649649
650
+ dev_put(rose->device);
650651 sock->sk = NULL;
651652 release_sock(sk);
652653 sock_put(sk);
....@@ -689,8 +690,10 @@
689690 rose->source_call = user->call;
690691 ax25_uid_put(user);
691692 } else {
692
- if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
693
+ if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
694
+ dev_put(dev);
693695 return -EACCES;
696
+ }
694697 rose->source_call = *source;
695698 }
696699
....@@ -721,7 +724,6 @@
721724 struct rose_sock *rose = rose_sk(sk);
722725 struct sockaddr_rose *addr = (struct sockaddr_rose *)uaddr;
723726 unsigned char cause, diagnostic;
724
- struct net_device *dev;
725727 ax25_uid_assoc *user;
726728 int n, err = 0;
727729
....@@ -778,9 +780,12 @@
778780 }
779781
780782 if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */
783
+ struct net_device *dev;
784
+
781785 sock_reset_flag(sk, SOCK_ZAPPED);
782786
783
- if ((dev = rose_dev_first()) == NULL) {
787
+ dev = rose_dev_first();
788
+ if (!dev) {
784789 err = -ENETUNREACH;
785790 goto out_release;
786791 }
....@@ -788,6 +793,7 @@
788793 user = ax25_findbyuid(current_euid());
789794 if (!user) {
790795 err = -EINVAL;
796
+ dev_put(dev);
791797 goto out_release;
792798 }
793799
....@@ -929,7 +935,7 @@
929935 /* Now attach up the new socket */
930936 skb->sk = NULL;
931937 kfree_skb(skb);
932
- sk->sk_ack_backlog--;
938
+ sk_acceptq_removed(sk);
933939
934940 out_release:
935941 release_sock(sk);
....@@ -1034,7 +1040,7 @@
10341040 make_rose->va = 0;
10351041 make_rose->vr = 0;
10361042 make_rose->vl = 0;
1037
- sk->sk_ack_backlog++;
1043
+ sk_acceptq_added(sk);
10381044
10391045 rose_insert_socket(make);
10401046
....@@ -1299,12 +1305,6 @@
12991305 return put_user(amount, (unsigned int __user *) argp);
13001306 }
13011307
1302
- case SIOCGSTAMP:
1303
- return sock_get_timestamp(sk, (struct timeval __user *) argp);
1304
-
1305
- case SIOCGSTAMPNS:
1306
- return sock_get_timestampns(sk, (struct timespec __user *) argp);
1307
-
13081308 case SIOCGIFADDR:
13091309 case SIOCSIFADDR:
13101310 case SIOCGIFDSTADDR:
....@@ -1472,6 +1472,7 @@
14721472 .getname = rose_getname,
14731473 .poll = datagram_poll,
14741474 .ioctl = rose_ioctl,
1475
+ .gettstamp = sock_gettstamp,
14751476 .listen = rose_listen,
14761477 .shutdown = sock_no_shutdown,
14771478 .setsockopt = rose_setsockopt,
....@@ -1503,7 +1504,7 @@
15031504 int rc;
15041505
15051506 if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device *)) {
1506
- printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter to large\n");
1507
+ printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter too large\n");
15071508 rc = -EINVAL;
15081509 goto out;
15091510 }