.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
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. |
---|
6 | 3 | * |
---|
7 | 4 | * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk) |
---|
8 | 5 | * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk) |
---|
.. | .. |
---|
297 | 294 | */ |
---|
298 | 295 | |
---|
299 | 296 | 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) |
---|
301 | 298 | { |
---|
302 | 299 | struct sock *sk = sock->sk; |
---|
303 | 300 | struct nr_sock *nr = nr_sk(sk); |
---|
304 | | - unsigned long opt; |
---|
| 301 | + unsigned int opt; |
---|
305 | 302 | |
---|
306 | 303 | if (level != SOL_NETROM) |
---|
307 | 304 | return -ENOPROTOOPT; |
---|
.. | .. |
---|
309 | 306 | if (optlen < sizeof(unsigned int)) |
---|
310 | 307 | return -EINVAL; |
---|
311 | 308 | |
---|
312 | | - if (get_user(opt, (unsigned int __user *)optval)) |
---|
| 309 | + if (copy_from_sockptr(&opt, optval, sizeof(opt))) |
---|
313 | 310 | return -EFAULT; |
---|
314 | 311 | |
---|
315 | 312 | switch (optname) { |
---|
316 | 313 | case NETROM_T1: |
---|
317 | | - if (opt < 1 || opt > ULONG_MAX / HZ) |
---|
| 314 | + if (opt < 1 || opt > UINT_MAX / HZ) |
---|
318 | 315 | return -EINVAL; |
---|
319 | 316 | nr->t1 = opt * HZ; |
---|
320 | 317 | return 0; |
---|
321 | 318 | |
---|
322 | 319 | case NETROM_T2: |
---|
323 | | - if (opt < 1 || opt > ULONG_MAX / HZ) |
---|
| 320 | + if (opt < 1 || opt > UINT_MAX / HZ) |
---|
324 | 321 | return -EINVAL; |
---|
325 | 322 | nr->t2 = opt * HZ; |
---|
326 | 323 | return 0; |
---|
.. | .. |
---|
332 | 329 | return 0; |
---|
333 | 330 | |
---|
334 | 331 | case NETROM_T4: |
---|
335 | | - if (opt < 1 || opt > ULONG_MAX / HZ) |
---|
| 332 | + if (opt < 1 || opt > UINT_MAX / HZ) |
---|
336 | 333 | return -EINVAL; |
---|
337 | 334 | nr->t4 = opt * HZ; |
---|
338 | 335 | return 0; |
---|
339 | 336 | |
---|
340 | 337 | case NETROM_IDLE: |
---|
341 | | - if (opt > ULONG_MAX / (60 * HZ)) |
---|
| 338 | + if (opt > UINT_MAX / (60 * HZ)) |
---|
342 | 339 | return -EINVAL; |
---|
343 | 340 | nr->idle = opt * 60 * HZ; |
---|
344 | 341 | return 0; |
---|
.. | .. |
---|
403 | 400 | struct sock *sk = sock->sk; |
---|
404 | 401 | |
---|
405 | 402 | lock_sock(sk); |
---|
| 403 | + if (sock->state != SS_UNCONNECTED) { |
---|
| 404 | + release_sock(sk); |
---|
| 405 | + return -EINVAL; |
---|
| 406 | + } |
---|
| 407 | + |
---|
406 | 408 | if (sk->sk_state != TCP_LISTEN) { |
---|
407 | 409 | memset(&nr_sk(sk)->user_addr, 0, AX25_ADDR_LEN); |
---|
408 | 410 | sk->sk_max_ack_backlog = backlog; |
---|
.. | .. |
---|
655 | 657 | |
---|
656 | 658 | if (sk->sk_state == TCP_ESTABLISHED) { |
---|
657 | 659 | err = -EISCONN; /* No reconnect on a seqpacket socket */ |
---|
| 660 | + goto out_release; |
---|
| 661 | + } |
---|
| 662 | + |
---|
| 663 | + if (sock->state == SS_CONNECTING) { |
---|
| 664 | + err = -EALREADY; |
---|
658 | 665 | goto out_release; |
---|
659 | 666 | } |
---|
660 | 667 | |
---|
.. | .. |
---|
1201 | 1208 | { |
---|
1202 | 1209 | struct sock *sk = sock->sk; |
---|
1203 | 1210 | void __user *argp = (void __user *)arg; |
---|
1204 | | - int ret; |
---|
1205 | 1211 | |
---|
1206 | 1212 | switch (cmd) { |
---|
1207 | 1213 | case TIOCOUTQ: { |
---|
.. | .. |
---|
1226 | 1232 | release_sock(sk); |
---|
1227 | 1233 | return put_user(amount, (int __user *)argp); |
---|
1228 | 1234 | } |
---|
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; |
---|
1241 | 1235 | |
---|
1242 | 1236 | case SIOCGIFADDR: |
---|
1243 | 1237 | case SIOCSIFADDR: |
---|
.. | .. |
---|
1268 | 1262 | #ifdef CONFIG_PROC_FS |
---|
1269 | 1263 | |
---|
1270 | 1264 | static void *nr_info_start(struct seq_file *seq, loff_t *pos) |
---|
| 1265 | + __acquires(&nr_list_lock) |
---|
1271 | 1266 | { |
---|
1272 | 1267 | spin_lock_bh(&nr_list_lock); |
---|
1273 | 1268 | return seq_hlist_start_head(&nr_list, *pos); |
---|
.. | .. |
---|
1279 | 1274 | } |
---|
1280 | 1275 | |
---|
1281 | 1276 | static void nr_info_stop(struct seq_file *seq, void *v) |
---|
| 1277 | + __releases(&nr_list_lock) |
---|
1282 | 1278 | { |
---|
1283 | 1279 | spin_unlock_bh(&nr_list_lock); |
---|
1284 | 1280 | } |
---|
.. | .. |
---|
1364 | 1360 | .getname = nr_getname, |
---|
1365 | 1361 | .poll = datagram_poll, |
---|
1366 | 1362 | .ioctl = nr_ioctl, |
---|
| 1363 | + .gettstamp = sock_gettstamp, |
---|
1367 | 1364 | .listen = nr_listen, |
---|
1368 | 1365 | .shutdown = sock_no_shutdown, |
---|
1369 | 1366 | .setsockopt = nr_setsockopt, |
---|