hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
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) {
....@@ -489,6 +487,12 @@
489487 {
490488 struct sock *sk = sock->sk;
491489
490
+ lock_sock(sk);
491
+ if (sock->state != SS_UNCONNECTED) {
492
+ release_sock(sk);
493
+ return -EINVAL;
494
+ }
495
+
492496 if (sk->sk_state != TCP_LISTEN) {
493497 struct rose_sock *rose = rose_sk(sk);
494498
....@@ -498,8 +502,10 @@
498502 memset(rose->dest_digis, 0, AX25_ADDR_LEN * ROSE_MAX_DIGIS);
499503 sk->sk_max_ack_backlog = backlog;
500504 sk->sk_state = TCP_LISTEN;
505
+ release_sock(sk);
501506 return 0;
502507 }
508
+ release_sock(sk);
503509
504510 return -EOPNOTSUPP;
505511 }
....@@ -594,6 +600,8 @@
594600 rose->idle = orose->idle;
595601 rose->defer = orose->defer;
596602 rose->device = orose->device;
603
+ if (rose->device)
604
+ dev_hold(rose->device);
597605 rose->qbitincl = orose->qbitincl;
598606
599607 return sk;
....@@ -647,6 +655,7 @@
647655 break;
648656 }
649657
658
+ dev_put(rose->device);
650659 sock->sk = NULL;
651660 release_sock(sk);
652661 sock_put(sk);
....@@ -689,8 +698,10 @@
689698 rose->source_call = user->call;
690699 ax25_uid_put(user);
691700 } else {
692
- if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE))
701
+ if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
702
+ dev_put(dev);
693703 return -EACCES;
704
+ }
694705 rose->source_call = *source;
695706 }
696707
....@@ -721,7 +732,6 @@
721732 struct rose_sock *rose = rose_sk(sk);
722733 struct sockaddr_rose *addr = (struct sockaddr_rose *)uaddr;
723734 unsigned char cause, diagnostic;
724
- struct net_device *dev;
725735 ax25_uid_assoc *user;
726736 int n, err = 0;
727737
....@@ -778,9 +788,12 @@
778788 }
779789
780790 if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */
791
+ struct net_device *dev;
792
+
781793 sock_reset_flag(sk, SOCK_ZAPPED);
782794
783
- if ((dev = rose_dev_first()) == NULL) {
795
+ dev = rose_dev_first();
796
+ if (!dev) {
784797 err = -ENETUNREACH;
785798 goto out_release;
786799 }
....@@ -788,6 +801,7 @@
788801 user = ax25_findbyuid(current_euid());
789802 if (!user) {
790803 err = -EINVAL;
804
+ dev_put(dev);
791805 goto out_release;
792806 }
793807
....@@ -929,7 +943,7 @@
929943 /* Now attach up the new socket */
930944 skb->sk = NULL;
931945 kfree_skb(skb);
932
- sk->sk_ack_backlog--;
946
+ sk_acceptq_removed(sk);
933947
934948 out_release:
935949 release_sock(sk);
....@@ -1034,7 +1048,7 @@
10341048 make_rose->va = 0;
10351049 make_rose->vr = 0;
10361050 make_rose->vl = 0;
1037
- sk->sk_ack_backlog++;
1051
+ sk_acceptq_added(sk);
10381052
10391053 rose_insert_socket(make);
10401054
....@@ -1299,12 +1313,6 @@
12991313 return put_user(amount, (unsigned int __user *) argp);
13001314 }
13011315
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
-
13081316 case SIOCGIFADDR:
13091317 case SIOCSIFADDR:
13101318 case SIOCGIFDSTADDR:
....@@ -1472,6 +1480,7 @@
14721480 .getname = rose_getname,
14731481 .poll = datagram_poll,
14741482 .ioctl = rose_ioctl,
1483
+ .gettstamp = sock_gettstamp,
14751484 .listen = rose_listen,
14761485 .shutdown = sock_no_shutdown,
14771486 .setsockopt = rose_setsockopt,
....@@ -1503,7 +1512,7 @@
15031512 int rc;
15041513
15051514 if (rose_ndevs > 0x7FFFFFFF/sizeof(struct net_device *)) {
1506
- printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter to large\n");
1515
+ printk(KERN_ERR "ROSE: rose_proto_init - rose_ndevs parameter too large\n");
15071516 rc = -EINVAL;
15081517 goto out;
15091518 }