如果copy_to_user()失败,则将返回值传递给setsockopts()调用者?

时间:2015-02-13 08:29:45

标签: linux-kernel sockets netfilter

我正在使用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);

我想将(内核空间)函数my_set_so()中的错误代码返回给用户空间。因此,我使用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()将返回一些系统错误代码,以防发生套接字级错误。如果错误出现在命令处理代码中,setsockopt()仍然返回0,并且必须从void*参数检查返回值。

这种理解是否正确?如果是,那么(用户空间)呼叫者应该如何被告知copy_to_user()的失败?

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你必须返回-EFAULT相应的手册页意味着

  

EFAULT   optval指向的地址不在进程地址空间的有效部分中。对于getsockopt(),如果optlen不在进程地址空间的有效部分,也可能返回此错误。

所以,

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? */
}