Does anyone know why we don't use the input 'optlen' parameter to the getsockopt(2) syscall, we do write back to it on return.
In ip_output() there is this, which suggests that someone had come across this before. #if 0 /* defined(IPSEC) */ case IP_IPSEC_POLICY: { struct mbuf *m = NULL; /* XXX this will return EINVAL as sopt is empty */ error = ipsec4_get_policy(inp, sopt->sopt_data, sopt->sopt_size, &m); if (error == 0) error = sockopt_setmbuf(sopt, m); break; } #endif /*IPSEC*/ There are also lots of places in sctp_usrreq that want to use it. I can set it with the following patch (line numbers will be slightly out), but wondered if there was a reason for the current behaviour. Index: uipc_syscalls.c =================================================================== RCS file: /cvsroot/src/sys/kern/uipc_syscalls.c,v retrieving revision 1.187 diff -u -r1.187 uipc_syscalls.c --- uipc_syscalls.c 20 Jun 2017 20:34:49 -0000 1.187 +++ uipc_syscalls.c 14 Oct 2017 21:33:09 -0000 @@ -1235,7 +1240,7 @@ if ((error = fd_getsock1(SCARG(uap, s), &so, &fp)) != 0) return (error); - sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), 0); + sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), valsize); if (fp->f_flag & FNOSIGPIPE) so->so_options |= SO_NOSIGPIPE;