如果 copy_to_user() 失败,将 return 值传递给 setsockopts() 调用方?

Passing return value to setsockopts() caller if copy_to_user() fails?

我正在使用 nf_register_sockopt():

注册新的 setsockopts() 命令
static struct nf_sockopt_ops my_sockopts = {
    list:       {NULL, NULL},
    pf:         PF_INET,
    set_optmin: MY_OPT_MIN,
    set_optmax: MY_OPT_MAX,
    set:        my_set_so,
    get_optmin: 0,
    get_optmax: 0,
    get:        NULL
};

nf_register_sockopt(&my_sockopts);

我想 return 来自(内核-space)函数 my_set_so() 的错误代码返回给用户 space。所以,我用 copy_to_user():

复制这段代码
int my_set_so(struct sock *sk, int cmd, void *param, unsigned int len) {
  struct my_so_param user_data;
  user_data.return_value = do_my_kernelspace_work();
  if (copy_to_user(param, &user_data, sizeof(user_data)))
    HOW TO INDICATE THE FAILURE HERE?
}

我了解 setsockopt(),根据手册页,如果发生套接字级错误,将 return 一些系统错误代码。如果错误出现在命令处理代码中,setsockopt()仍然是returns 0,并且必须从void*参数中检查return值。

这个理解对吗?如果是,应如何通知 (userspace) 调用者有关 copy_to_user() 的失败?

如果我理解你的问题,你必须 return -EFAULT 根据手册页的意思是

EFAULT The address pointed to by optval is not in a valid part of the process address space. For getsockopt(), this error may also be returned if optlen is not in a valid part of the process address space.

所以,

int my_set_so(struct sock *sk, int cmd, void *param, unsigned int len) {
  struct my_so_param user_data;
  user_data.return_value = do_my_kernelspace_work();
  if (copy_to_user(param, &user_data, sizeof(user_data)))
    return -EFAULT; /* HOW TO INDICATE THE FAILURE HERE? */
}