mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-23 20:18:21 -04:00
tipc: convert to getsockopt_iter
Convert TIPC sockets (msg, packet, stream proto_ops) to use the new getsockopt_iter callback with sockopt_t. Key changes: - Replace (char __user *optval, int __user *optlen) with sockopt_t *sopt - Use sopt->optlen for buffer length (input) and returned size (output) - Use copy_to_iter() instead of put_user()/copy_to_user() The sockopt_t parameter is named sopt to avoid collision with the existing optname parameter named opt. Note: Dropped the unnecessary parentheses to make checkpatch happier. Also dropped two now-stale comments that referred to the old "res" variable handling. Acked-by: Stanislav Fomichev <sdf@fomichev.me> Signed-off-by: Breno Leitao <leitao@debian.org> Link: https://patch.msgid.link/20260520-getsock_four-v3-6-b8c0b16b7780@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
4b94edae0b
commit
c56dbb469f
@@ -37,6 +37,7 @@
|
||||
|
||||
#include <linux/rhashtable.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/uio.h>
|
||||
#include <trace/events/sock.h>
|
||||
|
||||
#include "core.h"
|
||||
@@ -3220,8 +3221,7 @@ static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
|
||||
* @sock: socket structure
|
||||
* @lvl: option level
|
||||
* @opt: option identifier
|
||||
* @ov: receptacle for option value
|
||||
* @ol: receptacle for length of option value
|
||||
* @sopt: socket option container (input buffer length, output value/length)
|
||||
*
|
||||
* For stream sockets only, returns 0 length result for all IPPROTO_TCP options
|
||||
* (to ease compatibility).
|
||||
@@ -3229,22 +3229,22 @@ static int tipc_setsockopt(struct socket *sock, int lvl, int opt,
|
||||
* Return: 0 on success, errno otherwise
|
||||
*/
|
||||
static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
|
||||
char __user *ov, int __user *ol)
|
||||
sockopt_t *sopt)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
struct tipc_service_range seq;
|
||||
int len, scope;
|
||||
int res = 0;
|
||||
u32 value;
|
||||
int res;
|
||||
|
||||
if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
|
||||
return put_user(0, ol);
|
||||
if (lvl == IPPROTO_TCP && sock->type == SOCK_STREAM) {
|
||||
sopt->optlen = 0;
|
||||
return 0;
|
||||
}
|
||||
if (lvl != SOL_TIPC)
|
||||
return -ENOPROTOOPT;
|
||||
res = get_user(len, ol);
|
||||
if (res)
|
||||
return res;
|
||||
len = sopt->optlen;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
@@ -3260,7 +3260,6 @@ static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
|
||||
break;
|
||||
case TIPC_CONN_TIMEOUT:
|
||||
value = tsk->conn_timeout;
|
||||
/* no need to set "res", since already 0 at this point */
|
||||
break;
|
||||
case TIPC_NODE_RECVQ_DEPTH:
|
||||
value = 0; /* was tipc_queue_size, now obsolete */
|
||||
@@ -3284,15 +3283,17 @@ static int tipc_getsockopt(struct socket *sock, int lvl, int opt,
|
||||
release_sock(sk);
|
||||
|
||||
if (res)
|
||||
return res; /* "get" failed */
|
||||
return res;
|
||||
|
||||
if (len < sizeof(value))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_to_user(ov, &value, sizeof(value)))
|
||||
if (copy_to_iter(&value, sizeof(value), &sopt->iter_out) !=
|
||||
sizeof(value))
|
||||
return -EFAULT;
|
||||
sopt->optlen = sizeof(value);
|
||||
|
||||
return put_user(sizeof(value), ol);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
@@ -3365,7 +3366,7 @@ static const struct proto_ops msg_ops = {
|
||||
.listen = sock_no_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
.setsockopt = tipc_setsockopt,
|
||||
.getsockopt = tipc_getsockopt,
|
||||
.getsockopt_iter = tipc_getsockopt,
|
||||
.sendmsg = tipc_sendmsg,
|
||||
.recvmsg = tipc_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
@@ -3385,7 +3386,7 @@ static const struct proto_ops packet_ops = {
|
||||
.listen = tipc_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
.setsockopt = tipc_setsockopt,
|
||||
.getsockopt = tipc_getsockopt,
|
||||
.getsockopt_iter = tipc_getsockopt,
|
||||
.sendmsg = tipc_send_packet,
|
||||
.recvmsg = tipc_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
@@ -3405,7 +3406,7 @@ static const struct proto_ops stream_ops = {
|
||||
.listen = tipc_listen,
|
||||
.shutdown = tipc_shutdown,
|
||||
.setsockopt = tipc_setsockopt,
|
||||
.getsockopt = tipc_getsockopt,
|
||||
.getsockopt_iter = tipc_getsockopt,
|
||||
.sendmsg = tipc_sendstream,
|
||||
.recvmsg = tipc_recvstream,
|
||||
.mmap = sock_no_mmap,
|
||||
|
||||
Reference in New Issue
Block a user