| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/20 23:36 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": [
"IEEE802154",
"IEEE802154_SOCKET",
"IPV6",
"PHONET",
"TLS"
],
"FocusSymbols": [
"do_dgram_getsockopt",
"dgram_getsockopt",
"do_rawv6_getsockopt",
"rawv6_getsockopt",
"do_pep_getsockopt",
"pep_getsockopt",
"do_tls_getsockopt_conf",
"do_tls_getsockopt_tx_zc",
"do_tls_getsockopt_no_pad",
"do_tls_getsockopt_tx_payload_len",
"do_tls_getsockopt",
"tls_getsockopt"
],
"Reasoning": "The patch refactors the getsockopt implementation for IEEE802154, IPv6 raw sockets, Phonet, and TLS to use the new sockopt_t API and copy_to_iter instead of copy_to_user. This is a functional change in core network protocol handling that is reachable from userspace and should be fuzzed.",
"WorthFuzzing": true
} |
| 1/1 | 2026/07/20 23:36 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 3f1103302770d884d199773e70a011230d84900b\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Mon Jul 20 23:36:50 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c\nindex 85dce296d75139..763f63e48afe45 100644\n--- a/net/ieee802154/socket.c\n+++ b/net/ieee802154/socket.c\n@@ -831,20 +831,12 @@ static int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb)\n \treturn ret;\n }\n \n-static int dgram_getsockopt(struct sock *sk, int level, int optname,\n-\t\t\t char __user *optval, int __user *optlen)\n+static int do_dgram_getsockopt(struct sock *sk, int optname, sockopt_t *opt)\n {\n \tstruct dgram_sock *ro = dgram_sk(sk);\n-\n \tint val, len;\n \n-\tif (level != SOL_IEEE802154)\n-\t\treturn -EOPNOTSUPP;\n-\n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n-\n-\tlen = min_t(unsigned int, len, sizeof(int));\n+\tlen = min_t(unsigned int, opt-\u003eoptlen, sizeof(int));\n \n \tswitch (optname) {\n \tcase WPAN_WANTACK:\n@@ -871,10 +863,32 @@ static int dgram_getsockopt(struct sock *sk, int level, int optname,\n \t\treturn -ENOPROTOOPT;\n \t}\n \n-\tif (put_user(len, optlen))\n+\topt-\u003eoptlen = len;\n+\tif (copy_to_iter(\u0026val, len, \u0026opt-\u003eiter_out) != len)\n \t\treturn -EFAULT;\n-\tif (copy_to_user(optval, \u0026val, len))\n+\treturn 0;\n+}\n+\n+static int dgram_getsockopt(struct sock *sk, int level, int optname,\n+\t\t\t char __user *optval, int __user *optlen)\n+{\n+\tsockopt_t opt;\n+\tint err;\n+\n+\tif (level != SOL_IEEE802154)\n+\t\treturn -EOPNOTSUPP;\n+\n+\terr = sockopt_init_user(\u0026opt, optval, optlen);\n+\tif (err)\n+\t\treturn err;\n+\n+\terr = do_dgram_getsockopt(sk, optname, \u0026opt);\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (put_user(opt.optlen, optlen))\n \t\treturn -EFAULT;\n+\n \treturn 0;\n }\n \ndiff --git a/net/ipv6/raw.c b/net/ipv6/raw.c\nindex 3cc58698cbbd3a..1f15942d14163e 100644\n--- a/net/ipv6/raw.c\n+++ b/net/ipv6/raw.c\n@@ -1051,14 +1051,12 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,\n \treturn do_rawv6_setsockopt(sk, level, optname, optval, optlen);\n }\n \n-static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,\n-\t\t\t char __user *optval, int __user *optlen)\n+static int do_rawv6_getsockopt(struct sock *sk, int optname, sockopt_t *opt)\n {\n \tstruct raw6_sock *rp = raw6_sk(sk);\n \tint val, len;\n \n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n+\tlen = opt-\u003eoptlen;\n \n \tswitch (optname) {\n \tcase IPV6_HDRINCL:\n@@ -1082,9 +1080,8 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,\n \n \tlen = min_t(unsigned int, sizeof(int), len);\n \n-\tif (put_user(len, optlen))\n-\t\treturn -EFAULT;\n-\tif (copy_to_user(optval, \u0026val, len))\n+\topt-\u003eoptlen = len;\n+\tif (copy_to_iter(\u0026val, len, \u0026opt-\u003eiter_out) != len)\n \t\treturn -EFAULT;\n \treturn 0;\n }\n@@ -1092,6 +1089,9 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,\n static int rawv6_getsockopt(struct sock *sk, int level, int optname,\n \t\t\t char __user *optval, int __user *optlen)\n {\n+\tsockopt_t opt;\n+\tint err;\n+\n \tswitch (level) {\n \tcase SOL_RAW:\n \t\tbreak;\n@@ -1109,7 +1109,18 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,\n \t\treturn ipv6_getsockopt(sk, level, optname, optval, optlen);\n \t}\n \n-\treturn do_rawv6_getsockopt(sk, level, optname, optval, optlen);\n+\terr = sockopt_init_user(\u0026opt, optval, optlen);\n+\tif (err)\n+\t\treturn err;\n+\n+\terr = do_rawv6_getsockopt(sk, optname, \u0026opt);\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (put_user(opt.optlen, optlen))\n+\t\treturn -EFAULT;\n+\n+\treturn 0;\n }\n \n static int rawv6_ioctl(struct sock *sk, int cmd, int *karg)\ndiff --git a/net/phonet/pep.c b/net/phonet/pep.c\nindex 7069271393933e..7ef4a9a240ef8c 100644\n--- a/net/phonet/pep.c\n+++ b/net/phonet/pep.c\n@@ -1078,17 +1078,11 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,\n \treturn err;\n }\n \n-static int pep_getsockopt(struct sock *sk, int level, int optname,\n-\t\t\t\tchar __user *optval, int __user *optlen)\n+static int do_pep_getsockopt(struct sock *sk, int optname, sockopt_t *opt)\n {\n \tstruct pep_sock *pn = pep_sk(sk);\n \tint len, val;\n \n-\tif (level != SOL_PNPIPE)\n-\t\treturn -ENOPROTOOPT;\n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n-\n \tswitch (optname) {\n \tcase PNPIPE_ENCAP:\n \t\tval = pn-\u003eifindex ? PNPIPE_ENCAP_IP : PNPIPE_ENCAP_NONE;\n@@ -1112,11 +1106,33 @@ static int pep_getsockopt(struct sock *sk, int level, int optname,\n \t\treturn -ENOPROTOOPT;\n \t}\n \n-\tlen = min_t(unsigned int, sizeof(int), len);\n-\tif (put_user(len, optlen))\n+\tlen = umin(sizeof(int), opt-\u003eoptlen);\n+\topt-\u003eoptlen = len;\n+\tif (copy_to_iter(\u0026val, len, \u0026opt-\u003eiter_out) != len)\n \t\treturn -EFAULT;\n-\tif (put_user(val, (int __user *) optval))\n+\treturn 0;\n+}\n+\n+static int pep_getsockopt(struct sock *sk, int level, int optname,\n+\t\t\t char __user *optval, int __user *optlen)\n+{\n+\tsockopt_t opt;\n+\tint err;\n+\n+\tif (level != SOL_PNPIPE)\n+\t\treturn -ENOPROTOOPT;\n+\n+\terr = sockopt_init_user(\u0026opt, optval, optlen);\n+\tif (err)\n+\t\treturn err;\n+\n+\terr = do_pep_getsockopt(sk, optname, \u0026opt);\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (put_user(opt.optlen, optlen))\n \t\treturn -EFAULT;\n+\n \treturn 0;\n }\n \ndiff --git a/net/tls/tls_main.c b/net/tls/tls_main.c\nindex 8c588cdab733da..fbb274287aa5f2 100644\n--- a/net/tls/tls_main.c\n+++ b/net/tls/tls_main.c\n@@ -424,20 +424,16 @@ static __poll_t tls_sk_poll(struct file *file, struct socket *sock,\n \treturn mask;\n }\n \n-static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,\n-\t\t\t\t int __user *optlen, int tx)\n+static int do_tls_getsockopt_conf(struct sock *sk, sockopt_t *opt, int tx)\n {\n \tint rc = 0;\n \tconst struct tls_cipher_desc *cipher_desc;\n \tstruct tls_context *ctx = tls_get_ctx(sk);\n \tstruct tls_crypto_info *crypto_info;\n \tstruct cipher_context *cctx;\n-\tint len;\n+\tint len = opt-\u003eoptlen;\n \n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n-\n-\tif (!optval || (len \u003c sizeof(*crypto_info))) {\n+\tif (!opt-\u003eiter_out.ubuf || len \u003c sizeof(*crypto_info)) {\n \t\trc = -EINVAL;\n \t\tgoto out;\n \t}\n@@ -462,7 +458,8 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,\n \t}\n \n \tif (len == sizeof(*crypto_info)) {\n-\t\tif (copy_to_user(optval, crypto_info, sizeof(*crypto_info)))\n+\t\tif (copy_to_iter(crypto_info, sizeof(*crypto_info),\n+\t\t\t\t \u0026opt-\u003eiter_out) != sizeof(*crypto_info))\n \t\t\trc = -EFAULT;\n \t\tgoto out;\n \t}\n@@ -478,44 +475,38 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,\n \tmemcpy(crypto_info_rec_seq(crypto_info, cipher_desc),\n \t cctx-\u003erec_seq, cipher_desc-\u003erec_seq);\n \n-\tif (copy_to_user(optval, crypto_info, cipher_desc-\u003ecrypto_info))\n+\tif (copy_to_iter(crypto_info, cipher_desc-\u003ecrypto_info,\n+\t\t\t \u0026opt-\u003eiter_out) != cipher_desc-\u003ecrypto_info)\n \t\trc = -EFAULT;\n \n out:\n \treturn rc;\n }\n \n-static int do_tls_getsockopt_tx_zc(struct sock *sk, char __user *optval,\n-\t\t\t\t int __user *optlen)\n+static int do_tls_getsockopt_tx_zc(struct sock *sk, sockopt_t *opt)\n {\n \tstruct tls_context *ctx = tls_get_ctx(sk);\n \tunsigned int value;\n-\tint len;\n-\n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n+\tint len = opt-\u003eoptlen;\n \n \tif (len != sizeof(value))\n \t\treturn -EINVAL;\n \n \tvalue = ctx-\u003ezerocopy_sendfile;\n-\tif (copy_to_user(optval, \u0026value, sizeof(value)))\n+\tif (copy_to_iter(\u0026value, sizeof(value), \u0026opt-\u003eiter_out) != sizeof(value))\n \t\treturn -EFAULT;\n \n \treturn 0;\n }\n \n-static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,\n-\t\t\t\t int __user *optlen)\n+static int do_tls_getsockopt_no_pad(struct sock *sk, sockopt_t *opt)\n {\n \tstruct tls_context *ctx = tls_get_ctx(sk);\n-\tint value, len;\n+\tint value, len = opt-\u003eoptlen;\n \n \tif (ctx-\u003eprot_info.version != TLS_1_3_VERSION)\n \t\treturn -EINVAL;\n \n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n \tif (len \u003c sizeof(value))\n \t\treturn -EINVAL;\n \n@@ -525,38 +516,31 @@ static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,\n \tif (value \u003c 0)\n \t\treturn value;\n \n-\tif (put_user(sizeof(value), optlen))\n-\t\treturn -EFAULT;\n-\tif (copy_to_user(optval, \u0026value, sizeof(value)))\n+\topt-\u003eoptlen = sizeof(value);\n+\tif (copy_to_iter(\u0026value, sizeof(value), \u0026opt-\u003eiter_out) != sizeof(value))\n \t\treturn -EFAULT;\n \n \treturn 0;\n }\n \n-static int do_tls_getsockopt_tx_payload_len(struct sock *sk, char __user *optval,\n-\t\t\t\t\t int __user *optlen)\n+static int do_tls_getsockopt_tx_payload_len(struct sock *sk, sockopt_t *opt)\n {\n \tstruct tls_context *ctx = tls_get_ctx(sk);\n \tu16 payload_len = ctx-\u003etx_max_payload_len;\n-\tint len;\n-\n-\tif (get_user(len, optlen))\n-\t\treturn -EFAULT;\n+\tint len = opt-\u003eoptlen;\n \n \tif (len \u003c sizeof(payload_len))\n \t\treturn -EINVAL;\n \n-\tif (put_user(sizeof(payload_len), optlen))\n-\t\treturn -EFAULT;\n-\n-\tif (copy_to_user(optval, \u0026payload_len, sizeof(payload_len)))\n+\topt-\u003eoptlen = sizeof(payload_len);\n+\tif (copy_to_iter(\u0026payload_len, sizeof(payload_len),\n+\t\t\t \u0026opt-\u003eiter_out) != sizeof(payload_len))\n \t\treturn -EFAULT;\n \n \treturn 0;\n }\n \n-static int do_tls_getsockopt(struct sock *sk, int optname,\n-\t\t\t char __user *optval, int __user *optlen)\n+static int do_tls_getsockopt(struct sock *sk, int optname, sockopt_t *opt)\n {\n \tint rc = 0;\n \n@@ -565,17 +549,16 @@ static int do_tls_getsockopt(struct sock *sk, int optname,\n \tswitch (optname) {\n \tcase TLS_TX:\n \tcase TLS_RX:\n-\t\trc = do_tls_getsockopt_conf(sk, optval, optlen,\n-\t\t\t\t\t optname == TLS_TX);\n+\t\trc = do_tls_getsockopt_conf(sk, opt, optname == TLS_TX);\n \t\tbreak;\n \tcase TLS_TX_ZEROCOPY_RO:\n-\t\trc = do_tls_getsockopt_tx_zc(sk, optval, optlen);\n+\t\trc = do_tls_getsockopt_tx_zc(sk, opt);\n \t\tbreak;\n \tcase TLS_RX_EXPECT_NO_PAD:\n-\t\trc = do_tls_getsockopt_no_pad(sk, optval, optlen);\n+\t\trc = do_tls_getsockopt_no_pad(sk, opt);\n \t\tbreak;\n \tcase TLS_TX_MAX_PAYLOAD_LEN:\n-\t\trc = do_tls_getsockopt_tx_payload_len(sk, optval, optlen);\n+\t\trc = do_tls_getsockopt_tx_payload_len(sk, opt);\n \t\tbreak;\n \tdefault:\n \t\trc = -ENOPROTOOPT;\n@@ -591,12 +574,25 @@ static int tls_getsockopt(struct sock *sk, int level, int optname,\n \t\t\t char __user *optval, int __user *optlen)\n {\n \tstruct tls_context *ctx = tls_get_ctx(sk);\n+\tsockopt_t opt;\n+\tint err;\n \n \tif (level != SOL_TLS)\n \t\treturn ctx-\u003esk_proto-\u003egetsockopt(sk, level,\n \t\t\t\t\t\t optname, optval, optlen);\n \n-\treturn do_tls_getsockopt(sk, optname, optval, optlen);\n+\terr = sockopt_init_user(\u0026opt, optval, optlen);\n+\tif (err)\n+\t\treturn err;\n+\n+\terr = do_tls_getsockopt(sk, optname, \u0026opt);\n+\tif (err)\n+\t\treturn err;\n+\n+\tif (put_user(opt.optlen, optlen))\n+\t\treturn -EFAULT;\n+\n+\treturn 0;\n }\n \n static int validate_crypto_info(const struct tls_crypto_info *crypto_info,\ndiff --git a/tools/testing/selftests/net/getsockopt_iter.c b/tools/testing/selftests/net/getsockopt_iter.c\nindex fe5a5268bc34ec..974065a23fa825 100644\n--- a/tools/testing/selftests/net/getsockopt_iter.c\n+++ b/tools/testing/selftests/net/getsockopt_iter.c\n@@ -28,7 +28,10 @@\n #include \u003clinux/vm_sockets.h\u003e\n #include \u003clinux/icmp.h\u003e\n #include \u003cnetinet/in.h\u003e\n+#include \u003cnetinet/tcp.h\u003e\n+#include \u003carpa/inet.h\u003e\n #include \u003csys/socket.h\u003e\n+#include \u003clinux/tls.h\u003e\n #include \"kselftest_harness.h\"\n \n #ifndef AF_VSOCK\n@@ -40,6 +43,45 @@\n #ifndef ICMP_FILTER\n #define ICMP_FILTER 1\n #endif\n+#ifndef IPV6_HDRINCL\n+#define IPV6_HDRINCL 36\n+#endif\n+#ifndef IPV6_CHECKSUM\n+#define IPV6_CHECKSUM 7\n+#endif\n+#ifndef AF_IEEE802154\n+#define AF_IEEE802154 36\n+#endif\n+#ifndef SOL_IEEE802154\n+#define SOL_IEEE802154 0\n+#endif\n+#ifndef WPAN_WANTACK\n+#define WPAN_WANTACK 0\n+#endif\n+#ifndef AF_PHONET\n+#define AF_PHONET 35\n+#endif\n+#ifndef SOL_PNPIPE\n+#define SOL_PNPIPE 275\n+#endif\n+#ifndef PN_PROTO_PIPE\n+#define PN_PROTO_PIPE 2\n+#endif\n+#ifndef PNPIPE_ENCAP\n+#define PNPIPE_ENCAP 1\n+#endif\n+#ifndef PNPIPE_ENCAP_NONE\n+#define PNPIPE_ENCAP_NONE 0\n+#endif\n+#ifndef PNPIPE_ENCAP_IP\n+#define PNPIPE_ENCAP_IP 1\n+#endif\n+#ifndef SOL_TLS\n+#define SOL_TLS 282\n+#endif\n+#ifndef TCP_ULP\n+#define TCP_ULP 31\n+#endif\n \n /* ---------- netlink ---------- */\n \n@@ -394,4 +436,386 @@ TEST_F(raw, bad_optname)\n \tASSERT_EQ(sizeof(val), optlen);\n }\n \n+/* ---------- raw (ipv6) ---------- */\n+\n+FIXTURE(rawv6)\n+{\n+\tint fd;\n+};\n+\n+FIXTURE_SETUP(rawv6)\n+{\n+\tself-\u003efd = socket(AF_INET6, SOCK_RAW, IPPROTO_UDP);\n+\tif (self-\u003efd \u003c 0)\n+\t\tSKIP(return, \"SOCK_RAW/IPv6 socket: %s\", strerror(errno));\n+}\n+\n+FIXTURE_TEARDOWN(rawv6)\n+{\n+\tif (self-\u003efd \u003e= 0)\n+\t\tclose(self-\u003efd);\n+}\n+\n+TEST_F(rawv6, hdrincl_exact)\n+{\n+\tsocklen_t optlen;\n+\tint val = -1;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, IPPROTO_IPV6, IPV6_HDRINCL,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+\tASSERT_TRUE(val == 0 || val == 1);\n+}\n+\n+TEST_F(rawv6, hdrincl_oversize_clamped)\n+{\n+\tchar buf[16] = {};\n+\tsocklen_t optlen = sizeof(buf);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, IPPROTO_IPV6, IPV6_HDRINCL,\n+\t\t\t\tbuf, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+}\n+\n+/* Raw int options clamp the reported length down to the user buffer\n+ * instead of returning EINVAL on a short buffer.\n+ */\n+TEST_F(rawv6, hdrincl_undersize_clamped)\n+{\n+\tsocklen_t optlen = 2;\n+\tint val = 0;\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, IPPROTO_IPV6, IPV6_HDRINCL,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(2, optlen);\n+}\n+\n+TEST_F(rawv6, checksum_default)\n+{\n+\tsocklen_t optlen;\n+\tint val = 0;\n+\n+\toptlen = sizeof(val);\n+\n+\t/* A non-ICMPv6 raw socket has the checksum disabled, reported as -1. */\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, IPPROTO_IPV6, IPV6_CHECKSUM,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+\tASSERT_EQ(-1, val);\n+}\n+\n+TEST_F(rawv6, bad_optname)\n+{\n+\tsocklen_t optlen;\n+\tint val;\n+\n+\toptlen = sizeof(val);\n+\n+\t/* SOL_RAW reaches do_rawv6_getsockopt() directly. */\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_RAW, 0x7fff, \u0026val, \u0026optlen));\n+\tASSERT_EQ(ENOPROTOOPT, errno);\n+\tASSERT_EQ(sizeof(val), optlen);\n+}\n+\n+/* ---------- ieee802154 (dgram) ---------- */\n+\n+FIXTURE(ieee802154)\n+{\n+\tint fd;\n+};\n+\n+FIXTURE_SETUP(ieee802154)\n+{\n+\tself-\u003efd = socket(AF_IEEE802154, SOCK_DGRAM, 0);\n+\tif (self-\u003efd \u003c 0)\n+\t\tSKIP(return, \"AF_IEEE802154 dgram socket: %s\", strerror(errno));\n+}\n+\n+FIXTURE_TEARDOWN(ieee802154)\n+{\n+\tif (self-\u003efd \u003e= 0)\n+\t\tclose(self-\u003efd);\n+}\n+\n+TEST_F(ieee802154, wantack_exact)\n+{\n+\tsocklen_t optlen;\n+\tint val = -1;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_IEEE802154, WPAN_WANTACK,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+\tASSERT_TRUE(val == 0 || val == 1);\n+}\n+\n+TEST_F(ieee802154, wantack_oversize_clamped)\n+{\n+\tchar buf[16] = {};\n+\tsocklen_t optlen = sizeof(buf);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_IEEE802154, WPAN_WANTACK,\n+\t\t\t\tbuf, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+}\n+\n+TEST_F(ieee802154, wantack_undersize_clamped)\n+{\n+\tsocklen_t optlen = 2;\n+\tint val = 0;\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_IEEE802154, WPAN_WANTACK,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(2, optlen);\n+}\n+\n+TEST_F(ieee802154, bad_optname)\n+{\n+\tsocklen_t optlen;\n+\tint val;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_IEEE802154, 0x7fff,\n+\t\t\t\t \u0026val, \u0026optlen));\n+\tASSERT_EQ(ENOPROTOOPT, errno);\n+\tASSERT_EQ(sizeof(val), optlen);\n+}\n+\n+/* dgram_getsockopt() rejects any level other than SOL_IEEE802154. */\n+TEST_F(ieee802154, bad_level)\n+{\n+\tsocklen_t optlen;\n+\tint val;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_RAW, WPAN_WANTACK,\n+\t\t\t\t \u0026val, \u0026optlen));\n+\tASSERT_EQ(EOPNOTSUPP, errno);\n+\tASSERT_EQ(sizeof(val), optlen);\n+}\n+\n+/* ---------- phonet (pep) ---------- */\n+\n+FIXTURE(phonet)\n+{\n+\tint fd;\n+};\n+\n+FIXTURE_SETUP(phonet)\n+{\n+\tself-\u003efd = socket(AF_PHONET, SOCK_SEQPACKET, PN_PROTO_PIPE);\n+\tif (self-\u003efd \u003c 0)\n+\t\tSKIP(return, \"AF_PHONET pipe socket: %s\", strerror(errno));\n+}\n+\n+FIXTURE_TEARDOWN(phonet)\n+{\n+\tif (self-\u003efd \u003e= 0)\n+\t\tclose(self-\u003efd);\n+}\n+\n+TEST_F(phonet, encap_exact)\n+{\n+\tsocklen_t optlen;\n+\tint val = -1;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_PNPIPE, PNPIPE_ENCAP,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+\tASSERT_TRUE(val == PNPIPE_ENCAP_NONE || val == PNPIPE_ENCAP_IP);\n+}\n+\n+TEST_F(phonet, encap_oversize_clamped)\n+{\n+\tchar buf[16] = {};\n+\tsocklen_t optlen = sizeof(buf);\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_PNPIPE, PNPIPE_ENCAP,\n+\t\t\t\tbuf, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+}\n+\n+/* pep clamps the reported length down to the user buffer. Use an\n+ * int-sized backing buffer with a short optlen so the baseline kernel,\n+ * which writes a full int via put_user(), does not scribble past it.\n+ */\n+TEST_F(phonet, encap_undersize_clamped)\n+{\n+\tsocklen_t optlen = 2;\n+\tint val = 0;\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_PNPIPE, PNPIPE_ENCAP,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(2, optlen);\n+}\n+\n+TEST_F(phonet, bad_optname)\n+{\n+\tsocklen_t optlen;\n+\tint val;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_PNPIPE, 0x7fff, \u0026val, \u0026optlen));\n+\tASSERT_EQ(ENOPROTOOPT, errno);\n+\tASSERT_EQ(sizeof(val), optlen);\n+}\n+\n+/* pep_getsockopt() rejects any level other than SOL_PNPIPE. */\n+TEST_F(phonet, bad_level)\n+{\n+\tsocklen_t optlen;\n+\tint val;\n+\n+\toptlen = sizeof(val);\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_RAW, PNPIPE_ENCAP, \u0026val, \u0026optlen));\n+\tASSERT_EQ(ENOPROTOOPT, errno);\n+\tASSERT_EQ(sizeof(val), optlen);\n+}\n+\n+/* ---------- tls ---------- */\n+\n+FIXTURE(tls)\n+{\n+\tint fd;\n+\tint sfd;\n+};\n+\n+FIXTURE_SETUP(tls)\n+{\n+\tstruct sockaddr_in a = {\n+\t\t.sin_family = AF_INET,\n+\t\t.sin_addr.s_addr = htonl(INADDR_LOOPBACK),\n+\t};\n+\tsocklen_t alen = sizeof(a);\n+\tint lfd;\n+\n+\tself-\u003efd = -1;\n+\tself-\u003esfd = -1;\n+\n+\tlfd = socket(AF_INET, SOCK_STREAM, 0);\n+\tif (lfd \u003c 0)\n+\t\tSKIP(return, \"TCP socket: %s\", strerror(errno));\n+\tif (bind(lfd, (struct sockaddr *)\u0026a, sizeof(a)) || listen(lfd, 1) ||\n+\t getsockname(lfd, (struct sockaddr *)\u0026a, \u0026alen)) {\n+\t\tclose(lfd);\n+\t\tSKIP(return, \"listener setup: %s\", strerror(errno));\n+\t}\n+\tself-\u003efd = socket(AF_INET, SOCK_STREAM, 0);\n+\tif (connect(self-\u003efd, (struct sockaddr *)\u0026a, sizeof(a))) {\n+\t\tclose(lfd);\n+\t\tSKIP(return, \"connect: %s\", strerror(errno));\n+\t}\n+\tself-\u003esfd = accept(lfd, NULL, NULL);\n+\tclose(lfd);\n+\tif (setsockopt(self-\u003efd, IPPROTO_TCP, TCP_ULP, \"tls\", sizeof(\"tls\")))\n+\t\tSKIP(return, \"TCP_ULP=tls: %s (built without TLS?)\",\n+\t\t strerror(errno));\n+}\n+\n+FIXTURE_TEARDOWN(tls)\n+{\n+\tif (self-\u003efd \u003e= 0)\n+\t\tclose(self-\u003efd);\n+\tif (self-\u003esfd \u003e= 0)\n+\t\tclose(self-\u003esfd);\n+}\n+\n+/* do_tls_getsockopt_tx_zc(): fixed-size int, exact length required. */\n+TEST_F(tls, tx_zerocopy_exact)\n+{\n+\tsocklen_t optlen = sizeof(int);\n+\tint val = -1;\n+\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_TLS, TLS_TX_ZEROCOPY_RO,\n+\t\t\t\t\u0026val, \u0026optlen));\n+\tASSERT_EQ(sizeof(int), optlen);\n+\tASSERT_TRUE(val == 0 || val == 1);\n+}\n+\n+TEST_F(tls, tx_zerocopy_wrong_len)\n+{\n+\tsocklen_t optlen = 2;\n+\tint val;\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_TLS, TLS_TX_ZEROCOPY_RO,\n+\t\t\t\t \u0026val, \u0026optlen));\n+\tASSERT_EQ(EINVAL, errno);\n+}\n+\n+/* do_tls_getsockopt_conf(): NULL optval still yields EINVAL -- the\n+ * converted code tests opt-\u003eiter_out.ubuf in place of optval.\n+ */\n+TEST_F(tls, conf_null_optval)\n+{\n+\tsocklen_t optlen = 64;\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_TLS, TLS_TX, NULL, \u0026optlen));\n+\tASSERT_EQ(EINVAL, errno);\n+}\n+\n+TEST_F(tls, conf_short)\n+{\n+\tsocklen_t optlen = 2;\n+\tchar buf[2];\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_TLS, TLS_TX, buf, \u0026optlen));\n+\tASSERT_EQ(EINVAL, errno);\n+}\n+\n+/* TLS_TX before crypto is set reports not-ready. */\n+TEST_F(tls, conf_not_ready)\n+{\n+\tstruct tls_crypto_info info;\n+\tsocklen_t optlen = sizeof(info);\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_TLS, TLS_TX, \u0026info, \u0026optlen));\n+\tASSERT_EQ(EBUSY, errno);\n+}\n+\n+/* Set TX crypto, then read it back at the base and full sizes, exercising\n+ * both copy_to_iter() branches. SKIP if AES-GCM is unavailable.\n+ */\n+TEST_F(tls, conf_crypto_roundtrip)\n+{\n+\tstruct tls12_crypto_info_aes_gcm_128 tx = {\n+\t\t.info.version = TLS_1_2_VERSION,\n+\t\t.info.cipher_type = TLS_CIPHER_AES_GCM_128,\n+\t};\n+\tstruct tls12_crypto_info_aes_gcm_128 full;\n+\tstruct tls_crypto_info base;\n+\tsocklen_t optlen;\n+\n+\tif (setsockopt(self-\u003efd, SOL_TLS, TLS_TX, \u0026tx, sizeof(tx)))\n+\t\tSKIP(return, \"set TLS_TX aes_gcm_128: %s\", strerror(errno));\n+\n+\toptlen = sizeof(base);\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_TLS, TLS_TX, \u0026base, \u0026optlen));\n+\tASSERT_EQ(sizeof(base), optlen);\n+\tASSERT_EQ(TLS_1_2_VERSION, base.version);\n+\tASSERT_EQ(TLS_CIPHER_AES_GCM_128, base.cipher_type);\n+\n+\toptlen = sizeof(full);\n+\tASSERT_EQ(0, getsockopt(self-\u003efd, SOL_TLS, TLS_TX, \u0026full, \u0026optlen));\n+\tASSERT_EQ(sizeof(full), optlen);\n+\tASSERT_EQ(TLS_CIPHER_AES_GCM_128, full.info.cipher_type);\n+}\n+\n+TEST_F(tls, bad_optname)\n+{\n+\tsocklen_t optlen = sizeof(int);\n+\tint val;\n+\n+\tASSERT_EQ(-1, getsockopt(self-\u003efd, SOL_TLS, 0x7fff, \u0026val, \u0026optlen));\n+\tASSERT_EQ(ENOPROTOOPT, errno);\n+}\n+\n TEST_HARNESS_MAIN\n"
} |
| 2/1 | 2026/07/20 23:36 | agent | patch-evaluator |
0mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"IEEE802154",
"IEEE802154_SOCKET",
"IPV6",
"PHONET",
"TLS"
],
"FocusSymbols": [
"do_dgram_getsockopt",
"dgram_getsockopt",
"do_rawv6_getsockopt",
"rawv6_getsockopt",
"do_pep_getsockopt",
"pep_getsockopt",
"do_tls_getsockopt_conf",
"do_tls_getsockopt_tx_zc",
"do_tls_getsockopt_no_pad",
"do_tls_getsockopt_tx_payload_len",
"do_tls_getsockopt",
"tls_getsockopt"
],
"Reasoning": "The patch refactors the getsockopt implementation for IEEE802154, IPv6 raw sockets, Phonet, and TLS to use the new sockopt_t API and copy_to_iter instead of copy_to_user. This is a functional change in core network protocol handling that is reachable from userspace and should be fuzzed.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit 3f1103302770d884d199773e70a011230d84900b
Author: syz-cluster <triage@syzkaller.com>
Date: Mon Jul 20 23:36:50 2026 +0000
syz-cluster: applied patch under review
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index 85dce296d75139..763f63e48afe45 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -831,20 +831,12 @@ static int ieee802154_dgram_deliver(struct net_device *dev, struct sk_buff *skb)
return ret;
}
-static int dgram_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
+static int do_dgram_getsockopt(struct sock *sk, int optname, sockopt_t *opt)
{
struct dgram_sock *ro = dgram_sk(sk);
-
int val, len;
- if (level != SOL_IEEE802154)
- return -EOPNOTSUPP;
-
- if (get_user(len, optlen))
- return -EFAULT;
-
- len = min_t(unsigned int, len, sizeof(int));
+ len = min_t(unsigned int, opt->optlen, sizeof(int));
switch (optname) {
case WPAN_WANTACK:
@@ -871,10 +863,32 @@ static int dgram_getsockopt(struct sock *sk, int level, int optname,
return -ENOPROTOOPT;
}
- if (put_user(len, optlen))
+ opt->optlen = len;
+ if (copy_to_iter(&val, len, &opt->iter_out) != len)
return -EFAULT;
- if (copy_to_user(optval, &val, len))
+ return 0;
+}
+
+static int dgram_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ sockopt_t opt;
+ int err;
+
+ if (level != SOL_IEEE802154)
+ return -EOPNOTSUPP;
+
+ err = sockopt_init_user(&opt, optval, optlen);
+ if (err)
+ return err;
+
+ err = do_dgram_getsockopt(sk, optname, &opt);
+ if (err)
+ return err;
+
+ if (put_user(opt.optlen, optlen))
return -EFAULT;
+
return 0;
}
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 3cc58698cbbd3a..1f15942d14163e 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -1051,14 +1051,12 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
return do_rawv6_setsockopt(sk, level, optname, optval, optlen);
}
-static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
+static int do_rawv6_getsockopt(struct sock *sk, int optname, sockopt_t *opt)
{
struct raw6_sock *rp = raw6_sk(sk);
int val, len;
- if (get_user(len, optlen))
- return -EFAULT;
+ len = opt->optlen;
switch (optname) {
case IPV6_HDRINCL:
@@ -1082,9 +1080,8 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
len = min_t(unsigned int, sizeof(int), len);
- if (put_user(len, optlen))
- return -EFAULT;
- if (copy_to_user(optval, &val, len))
+ opt->optlen = len;
+ if (copy_to_iter(&val, len, &opt->iter_out) != len)
return -EFAULT;
return 0;
}
@@ -1092,6 +1089,9 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
static int rawv6_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
+ sockopt_t opt;
+ int err;
+
switch (level) {
case SOL_RAW:
break;
@@ -1109,7 +1109,18 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
return ipv6_getsockopt(sk, level, optname, optval, optlen);
}
- return do_rawv6_getsockopt(sk, level, optname, optval, optlen);
+ err = sockopt_init_user(&opt, optval, optlen);
+ if (err)
+ return err;
+
+ err = do_rawv6_getsockopt(sk, optname, &opt);
+ if (err)
+ return err;
+
+ if (put_user(opt.optlen, optlen))
+ return -EFAULT;
+
+ return 0;
}
static int rawv6_ioctl(struct sock *sk, int cmd, int *karg)
diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index 7069271393933e..7ef4a9a240ef8c 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c
@@ -1078,17 +1078,11 @@ static int pep_setsockopt(struct sock *sk, int level, int optname,
return err;
}
-static int pep_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
+static int do_pep_getsockopt(struct sock *sk, int optname, sockopt_t *opt)
{
struct pep_sock *pn = pep_sk(sk);
int len, val;
- if (level != SOL_PNPIPE)
- return -ENOPROTOOPT;
- if (get_user(len, optlen))
- return -EFAULT;
-
switch (optname) {
case PNPIPE_ENCAP:
val = pn->ifindex ? PNPIPE_ENCAP_IP : PNPIPE_ENCAP_NONE;
@@ -1112,11 +1106,33 @@ static int pep_getsockopt(struct sock *sk, int level, int optname,
return -ENOPROTOOPT;
}
- len = min_t(unsigned int, sizeof(int), len);
- if (put_user(len, optlen))
+ len = umin(sizeof(int), opt->optlen);
+ opt->optlen = len;
+ if (copy_to_iter(&val, len, &opt->iter_out) != len)
return -EFAULT;
- if (put_user(val, (int __user *) optval))
+ return 0;
+}
+
+static int pep_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ sockopt_t opt;
+ int err;
+
+ if (level != SOL_PNPIPE)
+ return -ENOPROTOOPT;
+
+ err = sockopt_init_user(&opt, optval, optlen);
+ if (err)
+ return err;
+
+ err = do_pep_getsockopt(sk, optname, &opt);
+ if (err)
+ return err;
+
+ if (put_user(opt.optlen, optlen))
return -EFAULT;
+
return 0;
}
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c
index 8c588cdab733da..fbb274287aa5f2 100644
--- a/net/tls/tls_main.c
+++ b/net/tls/tls_main.c
@@ -424,20 +424,16 @@ static __poll_t tls_sk_poll(struct file *file, struct socket *sock,
return mask;
}
-static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
- int __user *optlen, int tx)
+static int do_tls_getsockopt_conf(struct sock *sk, sockopt_t *opt, int tx)
{
int rc = 0;
const struct tls_cipher_desc *cipher_desc;
struct tls_context *ctx = tls_get_ctx(sk);
struct tls_crypto_info *crypto_info;
struct cipher_context *cctx;
- int len;
+ int len = opt->optlen;
- if (get_user(len, optlen))
- return -EFAULT;
-
- if (!optval || (len < sizeof(*crypto_info))) {
+ if (!opt->iter_out.ubuf || len < sizeof(*crypto_info)) {
rc = -EINVAL;
goto out;
}
@@ -462,7 +458,8 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
}
if (len == sizeof(*crypto_info)) {
- if (copy_to_user(optval, crypto_info, sizeof(*crypto_info)))
+ if (copy_to_iter(crypto_info, sizeof(*crypto_info),
+ &opt->iter_out) != sizeof(*crypto_info))
rc = -EFAULT;
goto out;
}
@@ -478,44 +475,38 @@ static int do_tls_getsockopt_conf(struct sock *sk, char __user *optval,
memcpy(crypto_info_rec_seq(crypto_info, cipher_desc),
cctx->rec_seq, cipher_desc->rec_seq);
- if (copy_to_user(optval, crypto_info, cipher_desc->crypto_info))
+ if (copy_to_iter(crypto_info, cipher_desc->crypto_info,
+ &opt->iter_out) != cipher_desc->crypto_info)
rc = -EFAULT;
out:
return rc;
}
-static int do_tls_getsockopt_tx_zc(struct sock *sk, char __user *optval,
- int __user *optlen)
+static int do_tls_getsockopt_tx_zc(struct sock *sk, sockopt_t *opt)
{
struct tls_context *ctx = tls_get_ctx(sk);
unsigned int value;
- int len;
-
- if (get_user(len, optlen))
- return -EFAULT;
+ int len = opt->optlen;
if (len != sizeof(value))
return -EINVAL;
value = ctx->zerocopy_sendfile;
- if (copy_to_user(optval, &value, sizeof(value)))
+ if (copy_to_iter(&value, sizeof(value), &opt->iter_out) != sizeof(value))
return -EFAULT;
return 0;
}
-static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,
- int __user *optlen)
+static int do_tls_getsockopt_no_pad(struct sock *sk, sockopt_t *opt)
{
struct tls_context *ctx = tls_get_ctx(sk);
- int value, len;
+ int value, len = opt->optlen;
if (ctx->prot_info.version != TLS_1_3_VERSION)
return -EINVAL;
- if (get_user(len, optlen))
- return -EFAULT;
if (len < sizeof(value))
return -EINVAL;
@@ -525,38 +516,31 @@ static int do_tls_getsockopt_no_pad(struct sock *sk, char __user *optval,
if (value < 0)
return value;
- if (put_user(sizeof(value), optlen))
- return -EFAULT;
- if (copy_to_user(optval, &value, sizeof(value)))
+ opt->optlen = sizeof(value);
+ if (copy_to_iter(&value, sizeof(value), &opt->iter_out) != sizeof(value))
return -EFAULT;
return 0;
}
-static int do_tls_getsockopt_tx_payload_len(struct sock *sk, char __user *optval,
- int __user *optlen)
+static int do_tls_getsockopt_tx_payload_len(struct sock *sk, sockopt_t *opt)
{
struct tls_context *ctx = tls_get_ctx(sk);
u16 payload_len = ctx->tx_max_payload_len;
- int len;
-
- if (get_user(len, optlen))
- return -EFAULT;
+ int len = opt->optlen;
if (len < sizeof(payload_len))
return -EINVAL;
- if (put_user(sizeof(payload_len), optlen))
- return -EFAULT;
-
- if (copy_to_user(optval, &payload_len, sizeof(payload_len)))
+ opt->optlen = sizeof(payload_len);
+ if (copy_to_iter(&payload_len, sizeof(payload_len),
+ &opt->iter_out) != sizeof(payload_len))
return -EFAULT;
return 0;
}
-static int do_tls_getsockopt(struct sock *sk, int optname,
- char __user *optval, int __user *optlen)
+static int do_tls_getsockopt(struct sock *sk, int optname, sockopt_t *opt)
{
int rc = 0;
@@ -565,17 +549,16 @@ static int do_tls_getsockopt(struct sock *sk, int optname,
switch (optname) {
case TLS_TX:
case TLS_RX:
- rc = do_tls_getsockopt_conf(sk, optval, optlen,
- optname == TLS_TX);
+ rc = do_tls_getsockopt_conf(sk, opt, optname == TLS_TX);
break;
case TLS_TX_ZEROCOPY_RO:
- rc = do_tls_getsockopt_tx_zc(sk, optval, optlen);
+ rc = do_tls_getsockopt_tx_zc(sk, opt);
break;
case TLS_RX_EXPECT_NO_PAD:
- rc = do_tls_getsockopt_no_pad(sk, optval, optlen);
+ rc = do_tls_getsockopt_no_pad(sk, opt);
break;
case TLS_TX_MAX_PAYLOAD_LEN:
- rc = do_tls_getsockopt_tx_payload_len(sk, optval, optlen);
+ rc = do_tls_getsockopt_tx_payload_len(sk, opt);
break;
default:
rc = -ENOPROTOOPT;
@@ -591,12 +574,25 @@ static int tls_getsockopt(struct sock *sk, int level, int optname,
char __user *optval, int __user *optlen)
{
struct tls_context *ctx = tls_get_ctx(sk);
+ sockopt_t opt;
+ int err;
if (level != SOL_TLS)
return ctx->sk_proto->getsockopt(sk, level,
optname, optval, optlen);
- return do_tls_getsockopt(sk, optname, optval, optlen);
+ err = sockopt_init_user(&opt, optval, optlen);
+ if (err)
+ return err;
+
+ err = do_tls_getsockopt(sk, optname, &opt);
+ if (err)
+ return err;
+
+ if (put_user(opt.optlen, optlen))
+ return -EFAULT;
+
+ return 0;
}
static int validate_crypto_info(const struct tls_crypto_info *crypto_info,
diff --git a/tools/testing/selftests/net/getsockopt_iter.c b/tools/testing/selftests/net/getsockopt_iter.c
index fe5a5268bc34ec..974065a23fa825 100644
--- a/tools/testing/selftests/net/getsockopt_iter.c
+++ b/tools/testing/selftests/net/getsockopt_iter.c
@@ -28,7 +28,10 @@
#include <linux/vm_sockets.h>
#include <linux/icmp.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
#include <sys/socket.h>
+#include <linux/tls.h>
#include "kselftest_harness.h"
#ifndef AF_VSOCK
@@ -40,6 +43,45 @@
#ifndef ICMP_FILTER
#define ICMP_FILTER 1
#endif
+#ifndef IPV6_HDRINCL
+#define IPV6_HDRINCL 36
+#endif
+#ifndef IPV6_CHECKSUM
+#define IPV6_CHECKSUM 7
+#endif
+#ifndef AF_IEEE802154
+#define AF_IEEE802154 36
+#endif
+#ifndef SOL_IEEE802154
+#define SOL_IEEE802154 0
+#endif
+#ifndef WPAN_WANTACK
+#define WPAN_WANTACK 0
+#endif
+#ifndef AF_PHONET
+#define AF_PHONET 35
+#endif
+#ifndef SOL_PNPIPE
+#define SOL_PNPIPE 275
+#endif
+#ifndef PN_PROTO_PIPE
+#define PN_PROTO_PIPE 2
+#endif
+#ifndef PNPIPE_ENCAP
+#define PNPIPE_ENCAP 1
+#endif
+#ifndef PNPIPE_ENCAP_NONE
+#define PNPIPE_ENCAP_NONE 0
+#endif
+#ifndef PNPIPE_ENCAP_IP
+#define PNPIPE_ENCAP_IP 1
+#endif
+#ifndef SOL_TLS
+#define SOL_TLS 282
+#endif
+#ifndef TCP_ULP
+#define TCP_ULP 31
+#endif
/* ---------- netlink ---------- */
@@ -394,4 +436,386 @@ TEST_F(raw, bad_optname)
ASSERT_EQ(sizeof(val), optlen);
}
+/* ---------- raw (ipv6) ---------- */
+
+FIXTURE(rawv6)
+{
+ int fd;
+};
+
+FIXTURE_SETUP(rawv6)
+{
+ self->fd = socket(AF_INET6, SOCK_RAW, IPPROTO_UDP);
+ if (self->fd < 0)
+ SKIP(return, "SOCK_RAW/IPv6 socket: %s", strerror(errno));
+}
+
+FIXTURE_TEARDOWN(rawv6)
+{
+ if (self->fd >= 0)
+ close(self->fd);
+}
+
+TEST_F(rawv6, hdrincl_exact)
+{
+ socklen_t optlen;
+ int val = -1;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(0, getsockopt(self->fd, IPPROTO_IPV6, IPV6_HDRINCL,
+ &val, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+ ASSERT_TRUE(val == 0 || val == 1);
+}
+
+TEST_F(rawv6, hdrincl_oversize_clamped)
+{
+ char buf[16] = {};
+ socklen_t optlen = sizeof(buf);
+
+ ASSERT_EQ(0, getsockopt(self->fd, IPPROTO_IPV6, IPV6_HDRINCL,
+ buf, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+}
+
+/* Raw int options clamp the reported length down to the user buffer
+ * instead of returning EINVAL on a short buffer.
+ */
+TEST_F(rawv6, hdrincl_undersize_clamped)
+{
+ socklen_t optlen = 2;
+ int val = 0;
+
+ ASSERT_EQ(0, getsockopt(self->fd, IPPROTO_IPV6, IPV6_HDRINCL,
+ &val, &optlen));
+ ASSERT_EQ(2, optlen);
+}
+
+TEST_F(rawv6, checksum_default)
+{
+ socklen_t optlen;
+ int val = 0;
+
+ optlen = sizeof(val);
+
+ /* A non-ICMPv6 raw socket has the checksum disabled, reported as -1. */
+ ASSERT_EQ(0, getsockopt(self->fd, IPPROTO_IPV6, IPV6_CHECKSUM,
+ &val, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+ ASSERT_EQ(-1, val);
+}
+
+TEST_F(rawv6, bad_optname)
+{
+ socklen_t optlen;
+ int val;
+
+ optlen = sizeof(val);
+
+ /* SOL_RAW reaches do_rawv6_getsockopt() directly. */
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_RAW, 0x7fff, &val, &optlen));
+ ASSERT_EQ(ENOPROTOOPT, errno);
+ ASSERT_EQ(sizeof(val), optlen);
+}
+
+/* ---------- ieee802154 (dgram) ---------- */
+
+FIXTURE(ieee802154)
+{
+ int fd;
+};
+
+FIXTURE_SETUP(ieee802154)
+{
+ self->fd = socket(AF_IEEE802154, SOCK_DGRAM, 0);
+ if (self->fd < 0)
+ SKIP(return, "AF_IEEE802154 dgram socket: %s", strerror(errno));
+}
+
+FIXTURE_TEARDOWN(ieee802154)
+{
+ if (self->fd >= 0)
+ close(self->fd);
+}
+
+TEST_F(ieee802154, wantack_exact)
+{
+ socklen_t optlen;
+ int val = -1;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_IEEE802154, WPAN_WANTACK,
+ &val, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+ ASSERT_TRUE(val == 0 || val == 1);
+}
+
+TEST_F(ieee802154, wantack_oversize_clamped)
+{
+ char buf[16] = {};
+ socklen_t optlen = sizeof(buf);
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_IEEE802154, WPAN_WANTACK,
+ buf, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+}
+
+TEST_F(ieee802154, wantack_undersize_clamped)
+{
+ socklen_t optlen = 2;
+ int val = 0;
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_IEEE802154, WPAN_WANTACK,
+ &val, &optlen));
+ ASSERT_EQ(2, optlen);
+}
+
+TEST_F(ieee802154, bad_optname)
+{
+ socklen_t optlen;
+ int val;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_IEEE802154, 0x7fff,
+ &val, &optlen));
+ ASSERT_EQ(ENOPROTOOPT, errno);
+ ASSERT_EQ(sizeof(val), optlen);
+}
+
+/* dgram_getsockopt() rejects any level other than SOL_IEEE802154. */
+TEST_F(ieee802154, bad_level)
+{
+ socklen_t optlen;
+ int val;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_RAW, WPAN_WANTACK,
+ &val, &optlen));
+ ASSERT_EQ(EOPNOTSUPP, errno);
+ ASSERT_EQ(sizeof(val), optlen);
+}
+
+/* ---------- phonet (pep) ---------- */
+
+FIXTURE(phonet)
+{
+ int fd;
+};
+
+FIXTURE_SETUP(phonet)
+{
+ self->fd = socket(AF_PHONET, SOCK_SEQPACKET, PN_PROTO_PIPE);
+ if (self->fd < 0)
+ SKIP(return, "AF_PHONET pipe socket: %s", strerror(errno));
+}
+
+FIXTURE_TEARDOWN(phonet)
+{
+ if (self->fd >= 0)
+ close(self->fd);
+}
+
+TEST_F(phonet, encap_exact)
+{
+ socklen_t optlen;
+ int val = -1;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_PNPIPE, PNPIPE_ENCAP,
+ &val, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+ ASSERT_TRUE(val == PNPIPE_ENCAP_NONE || val == PNPIPE_ENCAP_IP);
+}
+
+TEST_F(phonet, encap_oversize_clamped)
+{
+ char buf[16] = {};
+ socklen_t optlen = sizeof(buf);
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_PNPIPE, PNPIPE_ENCAP,
+ buf, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+}
+
+/* pep clamps the reported length down to the user buffer. Use an
+ * int-sized backing buffer with a short optlen so the baseline kernel,
+ * which writes a full int via put_user(), does not scribble past it.
+ */
+TEST_F(phonet, encap_undersize_clamped)
+{
+ socklen_t optlen = 2;
+ int val = 0;
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_PNPIPE, PNPIPE_ENCAP,
+ &val, &optlen));
+ ASSERT_EQ(2, optlen);
+}
+
+TEST_F(phonet, bad_optname)
+{
+ socklen_t optlen;
+ int val;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_PNPIPE, 0x7fff, &val, &optlen));
+ ASSERT_EQ(ENOPROTOOPT, errno);
+ ASSERT_EQ(sizeof(val), optlen);
+}
+
+/* pep_getsockopt() rejects any level other than SOL_PNPIPE. */
+TEST_F(phonet, bad_level)
+{
+ socklen_t optlen;
+ int val;
+
+ optlen = sizeof(val);
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_RAW, PNPIPE_ENCAP, &val, &optlen));
+ ASSERT_EQ(ENOPROTOOPT, errno);
+ ASSERT_EQ(sizeof(val), optlen);
+}
+
+/* ---------- tls ---------- */
+
+FIXTURE(tls)
+{
+ int fd;
+ int sfd;
+};
+
+FIXTURE_SETUP(tls)
+{
+ struct sockaddr_in a = {
+ .sin_family = AF_INET,
+ .sin_addr.s_addr = htonl(INADDR_LOOPBACK),
+ };
+ socklen_t alen = sizeof(a);
+ int lfd;
+
+ self->fd = -1;
+ self->sfd = -1;
+
+ lfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (lfd < 0)
+ SKIP(return, "TCP socket: %s", strerror(errno));
+ if (bind(lfd, (struct sockaddr *)&a, sizeof(a)) || listen(lfd, 1) ||
+ getsockname(lfd, (struct sockaddr *)&a, &alen)) {
+ close(lfd);
+ SKIP(return, "listener setup: %s", strerror(errno));
+ }
+ self->fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (connect(self->fd, (struct sockaddr *)&a, sizeof(a))) {
+ close(lfd);
+ SKIP(return, "connect: %s", strerror(errno));
+ }
+ self->sfd = accept(lfd, NULL, NULL);
+ close(lfd);
+ if (setsockopt(self->fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls")))
+ SKIP(return, "TCP_ULP=tls: %s (built without TLS?)",
+ strerror(errno));
+}
+
+FIXTURE_TEARDOWN(tls)
+{
+ if (self->fd >= 0)
+ close(self->fd);
+ if (self->sfd >= 0)
+ close(self->sfd);
+}
+
+/* do_tls_getsockopt_tx_zc(): fixed-size int, exact length required. */
+TEST_F(tls, tx_zerocopy_exact)
+{
+ socklen_t optlen = sizeof(int);
+ int val = -1;
+
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_TLS, TLS_TX_ZEROCOPY_RO,
+ &val, &optlen));
+ ASSERT_EQ(sizeof(int), optlen);
+ ASSERT_TRUE(val == 0 || val == 1);
+}
+
+TEST_F(tls, tx_zerocopy_wrong_len)
+{
+ socklen_t optlen = 2;
+ int val;
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_TLS, TLS_TX_ZEROCOPY_RO,
+ &val, &optlen));
+ ASSERT_EQ(EINVAL, errno);
+}
+
+/* do_tls_getsockopt_conf(): NULL optval still yields EINVAL -- the
+ * converted code tests opt->iter_out.ubuf in place of optval.
+ */
+TEST_F(tls, conf_null_optval)
+{
+ socklen_t optlen = 64;
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_TLS, TLS_TX, NULL, &optlen));
+ ASSERT_EQ(EINVAL, errno);
+}
+
+TEST_F(tls, conf_short)
+{
+ socklen_t optlen = 2;
+ char buf[2];
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_TLS, TLS_TX, buf, &optlen));
+ ASSERT_EQ(EINVAL, errno);
+}
+
+/* TLS_TX before crypto is set reports not-ready. */
+TEST_F(tls, conf_not_ready)
+{
+ struct tls_crypto_info info;
+ socklen_t optlen = sizeof(info);
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_TLS, TLS_TX, &info, &optlen));
+ ASSERT_EQ(EBUSY, errno);
+}
+
+/* Set TX crypto, then read it back at the base and full sizes, exercising
+ * both copy_to_iter() branches. SKIP if AES-GCM is unavailable.
+ */
+TEST_F(tls, conf_crypto_roundtrip)
+{
+ struct tls12_crypto_info_aes_gcm_128 tx = {
+ .info.version = TLS_1_2_VERSION,
+ .info.cipher_type = TLS_CIPHER_AES_GCM_128,
+ };
+ struct tls12_crypto_info_aes_gcm_128 full;
+ struct tls_crypto_info base;
+ socklen_t optlen;
+
+ if (setsockopt(self->fd, SOL_TLS, TLS_TX, &tx, sizeof(tx)))
+ SKIP(return, "set TLS_TX aes_gcm_128: %s", strerror(errno));
+
+ optlen = sizeof(base);
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_TLS, TLS_TX, &base, &optlen));
+ ASSERT_EQ(sizeof(base), optlen);
+ ASSERT_EQ(TLS_1_2_VERSION, base.version);
+ ASSERT_EQ(TLS_CIPHER_AES_GCM_128, base.cipher_type);
+
+ optlen = sizeof(full);
+ ASSERT_EQ(0, getsockopt(self->fd, SOL_TLS, TLS_TX, &full, &optlen));
+ ASSERT_EQ(sizeof(full), optlen);
+ ASSERT_EQ(TLS_CIPHER_AES_GCM_128, full.info.cipher_type);
+}
+
+TEST_F(tls, bad_optname)
+{
+ socklen_t optlen = sizeof(int);
+ int val;
+
+ ASSERT_EQ(-1, getsockopt(self->fd, SOL_TLS, 0x7fff, &val, &optlen));
+ ASSERT_EQ(ENOPROTOOPT, errno);
+}
+
TEST_HARNESS_MAIN
|
| 3/2 | 2026/07/20 23:36 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10833 output: 22 thoughts: 505 Thoughts: **Patch Series Evaluation: A Deep Dive into getsockopt Refactoring** Alright, let's break down this patch series. My initial impression is that we're looking at a pretty fundamental shift: the refactoring of `getsockopt` implementations. The patch touches several areas, specifically `net/ieee802154/socket.c`, `net/ipv6/raw.c`, `net/phonet/pep.c`, `net/tls/tls_main.c`, and even the selftests, `tools/testing/selftests/net/getsockopt_iter.c`. It appears they are moving from the older `copy_to_user` and `put_user` methods to the new `sockopt_t` and `copy_to_iter` API. Functionally, this is a change that impacts how `getsockopt` operates internally. My immediate question is about testability. Can we adequately cover this change in a virtualized environment? Yes, these are network protocols. `ieee802154`, `ipv6`, `phonet`, and `tls` are all network protocols, they should be testable within QEMU. So let's determine reachability. We need to focus on socket types that relate to the protocols. * `ieee802154` is handled with an `AF_IEEE802154` socket. * `ipv6` uses `SOCK_RAW`. * `phonet` uses `AF_PHONET`. * `tls` uses `TCP_ULP`. Okay, next, we have to identify the key functions that we need to fuzz. Time to identify targets: - `do_dgram_getsockopt` - `dgram_getsockopt` - `do_rawv6_getsockopt` - `rawv6_getsockopt` - `do_pep_getsockopt` - `pep_getsockopt` - `do_tls_getsockopt_conf` - `do_tls_getsockopt_tx_zc` - `do_tls_getsockopt_no_pad` - `do_tls_getsockopt_tx_payload_len` - `do_tls_getsockopt` - `tls_getsockopt` Finally, we have to consider the configurations. We will have to ensure we have the following configs enabled: - `CONFIG_IEEE802154` - `CONFIG_IEEE802154_SOCKET` - `CONFIG_IPV6` - `CONFIG_PHONET` - `CONFIG_TLS` We'll verify these configurations before running tests to make sure we're hitting the relevant code paths. Time to go verify these configs! |
| 4/2 | 2026/07/20 23:36 | tool | grepper |
0mArgs:{
"Expression": "config IEEE802154"
}Results: {
"Output": "drivers/net/ieee802154/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/ieee802154/Kconfig:2:menuconfig IEEE802154_DRIVERS\ndrivers/net/ieee802154/Kconfig-3-\ttristate \"IEEE 802.15.4 drivers\"\n--\ndrivers/net/ieee802154/Kconfig-13-\ndrivers/net/ieee802154/Kconfig:14:config IEEE802154_FAKELB\ndrivers/net/ieee802154/Kconfig-15-\tdepends on IEEE802154_DRIVERS \u0026\u0026 MAC802154\n--\ndrivers/net/ieee802154/Kconfig-23-\ndrivers/net/ieee802154/Kconfig:24:config IEEE802154_AT86RF230\ndrivers/net/ieee802154/Kconfig-25-\tdepends on IEEE802154_DRIVERS \u0026\u0026 MAC802154\n--\ndrivers/net/ieee802154/Kconfig-35-\ndrivers/net/ieee802154/Kconfig:36:config IEEE802154_MRF24J40\ndrivers/net/ieee802154/Kconfig-37-\ttristate \"Microchip MRF24J40 transceiver driver\"\n--\ndrivers/net/ieee802154/Kconfig-47-\ndrivers/net/ieee802154/Kconfig:48:config IEEE802154_CC2520\ndrivers/net/ieee802154/Kconfig-49-\tdepends on IEEE802154_DRIVERS \u0026\u0026 MAC802154\n--\ndrivers/net/ieee802154/Kconfig-58-\ndrivers/net/ieee802154/Kconfig:59:config IEEE802154_ATUSB\ndrivers/net/ieee802154/Kconfig-60-\ttristate \"ATUSB transceiver driver\"\n--\ndrivers/net/ieee802154/Kconfig-68-\ndrivers/net/ieee802154/Kconfig:69:config IEEE802154_ADF7242\ndrivers/net/ieee802154/Kconfig-70-\ttristate \"ADF7242 transceiver driver\"\n--\ndrivers/net/ieee802154/Kconfig-79-\ndrivers/net/ieee802154/Kconfig:80:config IEEE802154_CA8210\ndrivers/net/ieee802154/Kconfig-81-\ttristate \"Cascoda CA8210 transceiver driver\"\n--\ndrivers/net/ieee802154/Kconfig-91-\ndrivers/net/ieee802154/Kconfig:92:config IEEE802154_CA8210_DEBUGFS\ndrivers/net/ieee802154/Kconfig-93-\tbool \"CA8210 debugfs interface\"\n--\ndrivers/net/ieee802154/Kconfig-101-\ndrivers/net/ieee802154/Kconfig:102:config IEEE802154_MCR20A\ndrivers/net/ieee802154/Kconfig-103-\ttristate \"MCR20A transceiver driver\"\n--\ndrivers/net/ieee802154/Kconfig-113-\ndrivers/net/ieee802154/Kconfig:114:config IEEE802154_HWSIM\ndrivers/net/ieee802154/Kconfig-115-\tdepends on IEEE802154_DRIVERS \u0026\u0026 MAC802154\n--\nnet/ieee802154/6lowpan/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\nnet/ieee802154/6lowpan/Kconfig:2:config IEEE802154_6LOWPAN\nnet/ieee802154/6lowpan/Kconfig-3-\ttristate \"6lowpan support over IEEE 802.15.4\"\n--\nnet/ieee802154/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\nnet/ieee802154/Kconfig:2:menuconfig IEEE802154\nnet/ieee802154/Kconfig-3-\ttristate \"IEEE Std 802.15.4 Low-Rate Wireless Personal Area Networks support\"\n--\nnet/ieee802154/Kconfig=14=if IEEE802154\nnet/ieee802154/Kconfig-15-\nnet/ieee802154/Kconfig:16:config IEEE802154_NL802154_EXPERIMENTAL\nnet/ieee802154/Kconfig-17-\tbool \"IEEE 802.15.4 experimental netlink support\"\n--\nnet/ieee802154/Kconfig-20-\nnet/ieee802154/Kconfig:21:config IEEE802154_SOCKET\nnet/ieee802154/Kconfig-22-\ttristate \"IEEE 802.15.4 socket interface\"\n"
} |
| 5/2 | 2026/07/20 23:37 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 13442 output: 34 thoughts: 53 Thoughts: Okay, here's my take on those configurations, thinking through them as I would approach a new project: **Configuring a Secure Wireless Network** Alright, let's break this down. The core seems to revolve around building a secure wireless network, probably an embedded or IoT kind of thing, given the configurations listed. First, `IEEE802154` is the foundation. It's the physical and MAC layer standard for low-power, low-rate wireless personal area networks. Then, `IEEE802154_SOCKET` suggests the application layer will be built on sockets – which makes sense for flexibility and potential interfacing with other network stacks. `IPV6` tells me we're planning for the future, embracing a modern internet protocol. Good. Scalability and a larger address space are definitely key considerations, especially if we are expecting a multitude of devices. `PHONET` – now that’s interesting. It suggests a proprietary or application-specific networking layer *above* 802.15.4 and potentially *below* IPv6. I need to understand that better. Is this about mesh networking, a particular routing protocol, or something else entirely? We'll need to drill down on its implementation. Finally, `TLS`. Perfect. End-to-end security is essential for any modern network. I’m thinking encryption, authentication, integrity checks... the whole shebang. So the assumption is the underlying radio and network layers are considered untrusted, hence the necessity of a secure transport layer. The core question now, is to immediately verify the specifics of `PHONET` and `TLS`. Are they compatible with each other, and the expected constraints of the hardware? Is the TLS implementation optimized for low-power devices? Are there any security vulnerabilities that need to be addressed? Time to dig into the details and make sure the pieces fit before moving any further. |
| 6/2 | 2026/07/20 23:37 | tool | grepper |
0mArgs:{
"Expression": "config PHONET"
}Results: {
"Output": "net/phonet/Kconfig-5-\nnet/phonet/Kconfig:6:config PHONET\nnet/phonet/Kconfig-7-\ttristate \"Phonet protocols family\"\n"
} |
| 7/2 | 2026/07/20 23:37 | tool | grepper |
0mArgs:{
"Expression": "config TLS"
}Results: {
"Output": "arch/arm/mm/Kconfig=873=config HARDEN_BRANCH_HISTORY\n--\narch/arm/mm/Kconfig-882-\narch/arm/mm/Kconfig:883:config TLS_REG_EMUL\narch/arm/mm/Kconfig-884-\tbool\n--\nnet/tls/Kconfig-4-#\nnet/tls/Kconfig:5:config TLS\nnet/tls/Kconfig-6-\ttristate \"Transport Layer Security support\"\n--\nnet/tls/Kconfig-18-\nnet/tls/Kconfig:19:config TLS_DEVICE\nnet/tls/Kconfig-20-\tbool \"Transport Layer Security HW offload\"\n"
} |
| 8/2 | 2026/07/20 23:37 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 14165 output: 276 thoughts: 711 Thoughts: **Refactoring Getsockopt Implementation** Okay, so this patch is a refactor of the `getsockopt` implementation for a few key areas: `ieee802154`, `ipv6`, `phonet`, and `tls`. The driving force behind these changes is a functional improvement, specifically switching from `copy_to_user` to `copy_to_iter`. This immediately signals a core kernel change, which means I need to pay close attention to the implications. My focus is on the following symbols: `do_dgram_getsockopt`, `dgram_getsockopt`, `do_rawv6_getsockopt`, `rawv6_getsockopt`, `do_pep_getsockopt`, `pep_getsockopt`, and the various `do_tls_getsockopt_*` functions and `tls_getsockopt` itself. These are the critical points of this modification. The related configurations are `IEEE802154`, `IEEE802154_SOCKET`, `IPV6`, `PHONET`, and `TLS`. I'm going to quickly verify if these are the only relevant configurations and check their dependencies. `IPV6` is pretty much a given. `IEEE802154_SOCKET` clearly depends on `IEEE802154`. `PHONET` and `TLS` are protocol families, so that's all straightforward. Let me pinpoint where these functions are defined. `dgram_getsockopt` resides in `net/ieee802154/socket.c`, `rawv6_getsockopt` is in `net/ipv6/raw.c`, `pep_getsockopt` is in `net/phonet/pep.c`, and the `tls_getsockopt` functions live in `net/tls/tls_main.c`. Now, I need to make sure I've identified all the relevant functions, particularly with TLS. Okay, there's `do_tls_getsockopt_conf`, `do_tls_getsockopt_tx_zc`, `do_tls_getsockopt_no_pad`, `do_tls_getsockopt_tx_payload_len`, `do_tls_getsockopt`, and `tls_getsockopt`. Got it. Just to be absolutely sure, let's verify if each of the *do_* functions is the only one in its respective module. `ieee802154` only has `do_dgram_getsockopt`, that's good. `ipv6` only has `do_rawv6_getsockopt`, perfect. `phonet` has `do_pep_getsockopt`, fine. And then, there are multiple functions associated with TLS. Right, I'll update my notes to reflect all of these functions under `FocusSymbols`. And I'll be certain to list these configurations as `EnableConfigs` to keep track. So, here's my updated list of configurations. `IEEE802154` `IEEE802154_SOCKET` `IPV6` `PHONET` `TLS` I'm ready to call `set-results`. |
| 9/2 | 2026/07/20 23:37 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"IEEE802154",
"IEEE802154_SOCKET",
"IPV6",
"PHONET",
"TLS"
],
"FocusSymbols": [
"do_dgram_getsockopt",
"dgram_getsockopt",
"do_rawv6_getsockopt",
"rawv6_getsockopt",
"do_pep_getsockopt",
"pep_getsockopt",
"do_tls_getsockopt_conf",
"do_tls_getsockopt_tx_zc",
"do_tls_getsockopt_no_pad",
"do_tls_getsockopt_tx_payload_len",
"do_tls_getsockopt",
"tls_getsockopt"
],
"Reasoning": "The patch refactors the getsockopt implementation for IEEE802154, IPv6 raw sockets, Phonet, and TLS to use the new sockopt_t API and copy_to_iter instead of copy_to_user. This is a functional change in core network protocol handling that is reachable from userspace and should be fuzzed.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"IEEE802154",
"IEEE802154_SOCKET",
"IPV6",
"PHONET",
"TLS"
],
"FocusSymbols": [
"do_dgram_getsockopt",
"dgram_getsockopt",
"do_rawv6_getsockopt",
"rawv6_getsockopt",
"do_pep_getsockopt",
"pep_getsockopt",
"do_tls_getsockopt_conf",
"do_tls_getsockopt_tx_zc",
"do_tls_getsockopt_no_pad",
"do_tls_getsockopt_tx_payload_len",
"do_tls_getsockopt",
"tls_getsockopt"
],
"Reasoning": "The patch refactors the getsockopt implementation for IEEE802154, IPv6 raw sockets, Phonet, and TLS to use the new sockopt_t API and copy_to_iter instead of copy_to_user. This is a functional change in core network protocol handling that is reachable from userspace and should be fuzzed.",
"WorthFuzzing": true
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|