mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 22:19:30 +02:00
phonet: pep: convert getsockopt to sockopt_t
Continue converting the proto-layer getsockopt callbacks to the sockopt_t interface, splitting pep_getsockopt() into a do_pep_getsockopt() helper that takes a sockopt_t. The thin pep_getsockopt() wrapper keeps its __user signature for now: it builds a user-backed sockopt_t with sockopt_init_user(), calls the helper, and writes the returned length back to optlen. The helper uses copy_to_iter() instead of copy_to_user(). No functional change. Acked-by: Rémi Denis-Courmont <remi@remlab.net> Reviewed-by: Joe Damato <joe@dama.to> Acked-by: Stanislav Fomichev <sdf@fomichev.me> Signed-off-by: Breno Leitao <leitao@debian.org> Link: https://patch.msgid.link/20260729-getsockopt_phase4-v4-5-c44576757c17@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
77e5eb0e19
commit
d05a7f0ab5
+26
-10
@@ -1080,17 +1080,11 @@ out_norel:
|
||||
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;
|
||||
@@ -1114,11 +1108,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 (copy_to_user(optval, &val, len))
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user