hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/netrom/af_netrom.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 Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
85 * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
....@@ -297,11 +294,11 @@
297294 */
298295
299296 static int nr_setsockopt(struct socket *sock, int level, int optname,
300
- char __user *optval, unsigned int optlen)
297
+ sockptr_t optval, unsigned int optlen)
301298 {
302299 struct sock *sk = sock->sk;
303300 struct nr_sock *nr = nr_sk(sk);
304
- unsigned long opt;
301
+ unsigned int opt;
305302
306303 if (level != SOL_NETROM)
307304 return -ENOPROTOOPT;
....@@ -309,18 +306,18 @@
309306 if (optlen < sizeof(unsigned int))
310307 return -EINVAL;
311308
312
- if (get_user(opt, (unsigned int __user *)optval))
309
+ if (copy_from_sockptr(&opt, optval, sizeof(opt)))
313310 return -EFAULT;
314311
315312 switch (optname) {
316313 case NETROM_T1:
317
- if (opt < 1 || opt > ULONG_MAX / HZ)
314
+ if (opt < 1 || opt > UINT_MAX / HZ)
318315 return -EINVAL;
319316 nr->t1 = opt * HZ;
320317 return 0;
321318
322319 case NETROM_T2:
323
- if (opt < 1 || opt > ULONG_MAX / HZ)
320
+ if (opt < 1 || opt > UINT_MAX / HZ)
324321 return -EINVAL;
325322 nr->t2 = opt * HZ;
326323 return 0;
....@@ -332,13 +329,13 @@
332329 return 0;
333330
334331 case NETROM_T4:
335
- if (opt < 1 || opt > ULONG_MAX / HZ)
332
+ if (opt < 1 || opt > UINT_MAX / HZ)
336333 return -EINVAL;
337334 nr->t4 = opt * HZ;
338335 return 0;
339336
340337 case NETROM_IDLE:
341
- if (opt > ULONG_MAX / (60 * HZ))
338
+ if (opt > UINT_MAX / (60 * HZ))
342339 return -EINVAL;
343340 nr->idle = opt * 60 * HZ;
344341 return 0;
....@@ -403,6 +400,11 @@
403400 struct sock *sk = sock->sk;
404401
405402 lock_sock(sk);
403
+ if (sock->state != SS_UNCONNECTED) {
404
+ release_sock(sk);
405
+ return -EINVAL;
406
+ }
407
+
406408 if (sk->sk_state != TCP_LISTEN) {
407409 memset(&nr_sk(sk)->user_addr, 0, AX25_ADDR_LEN);
408410 sk->sk_max_ack_backlog = backlog;
....@@ -655,6 +657,11 @@
655657
656658 if (sk->sk_state == TCP_ESTABLISHED) {
657659 err = -EISCONN; /* No reconnect on a seqpacket socket */
660
+ goto out_release;
661
+ }
662
+
663
+ if (sock->state == SS_CONNECTING) {
664
+ err = -EALREADY;
658665 goto out_release;
659666 }
660667
....@@ -1201,7 +1208,6 @@
12011208 {
12021209 struct sock *sk = sock->sk;
12031210 void __user *argp = (void __user *)arg;
1204
- int ret;
12051211
12061212 switch (cmd) {
12071213 case TIOCOUTQ: {
....@@ -1226,18 +1232,6 @@
12261232 release_sock(sk);
12271233 return put_user(amount, (int __user *)argp);
12281234 }
1229
-
1230
- case SIOCGSTAMP:
1231
- lock_sock(sk);
1232
- ret = sock_get_timestamp(sk, argp);
1233
- release_sock(sk);
1234
- return ret;
1235
-
1236
- case SIOCGSTAMPNS:
1237
- lock_sock(sk);
1238
- ret = sock_get_timestampns(sk, argp);
1239
- release_sock(sk);
1240
- return ret;
12411235
12421236 case SIOCGIFADDR:
12431237 case SIOCSIFADDR:
....@@ -1268,6 +1262,7 @@
12681262 #ifdef CONFIG_PROC_FS
12691263
12701264 static void *nr_info_start(struct seq_file *seq, loff_t *pos)
1265
+ __acquires(&nr_list_lock)
12711266 {
12721267 spin_lock_bh(&nr_list_lock);
12731268 return seq_hlist_start_head(&nr_list, *pos);
....@@ -1279,6 +1274,7 @@
12791274 }
12801275
12811276 static void nr_info_stop(struct seq_file *seq, void *v)
1277
+ __releases(&nr_list_lock)
12821278 {
12831279 spin_unlock_bh(&nr_list_lock);
12841280 }
....@@ -1364,6 +1360,7 @@
13641360 .getname = nr_getname,
13651361 .poll = datagram_poll,
13661362 .ioctl = nr_ioctl,
1363
+ .gettstamp = sock_gettstamp,
13671364 .listen = nr_listen,
13681365 .shutdown = sock_no_shutdown,
13691366 .setsockopt = nr_setsockopt,