如果 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? */
}
我正在使用 nf_register_sockopt()
:
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? */
}