Continue converting the proto-layer getsockopt callbacks to the sockopt_t interface, splitting dgram_getsockopt() into a do_dgram_getsockopt() helper that takes a sockopt_t.
No functional change. Signed-off-by: Breno Leitao <[email protected]> --- net/ieee802154/socket.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c index 85dce296d7513..763f63e48afe4 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; } -- 2.53.0-Meta

