]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tipc: convert to getsockopt_iter
authorBreno Leitao <leitao@debian.org>
Wed, 20 May 2026 16:53:51 +0000 (09:53 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 22 May 2026 18:11:10 +0000 (11:11 -0700)
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>
net/tipc/socket.c

index 9329919fb07f074a8a9d6c1b3a7bacd86083bb64..3a94278a44ac4f1b271d87a6f8dd4c0c57a0362d 100644 (file)
@@ -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,