Skip to content

Commit

Permalink
bpfilter: switch bpfilter_ip_set_sockopt to sockptr_t
Browse files Browse the repository at this point in the history
This is mostly to prepare for cleaning up the callers, as bpfilter by
design can't handle kernel pointers.

Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Christoph Hellwig authored and davem330 committed Jul 24, 2020
1 parent c2f1263 commit b03afaa
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 11 deletions.
6 changes: 3 additions & 3 deletions include/linux/bpfilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

#include <uapi/linux/bpfilter.h>
#include <linux/usermode_driver.h>
#include <linux/sockptr.h>

struct sock;
int bpfilter_ip_set_sockopt(struct sock *sk, int optname, char __user *optval,
int bpfilter_ip_set_sockopt(struct sock *sk, int optname, sockptr_t optval,
unsigned int optlen);
int bpfilter_ip_get_sockopt(struct sock *sk, int optname, char __user *optval,
int __user *optlen);
Expand All @@ -16,8 +17,7 @@ struct bpfilter_umh_ops {
struct umd_info info;
/* since ip_getsockopt() can run in parallel, serialize access to umh */
struct mutex lock;
int (*sockopt)(struct sock *sk, int optname,
char __user *optval,
int (*sockopt)(struct sock *sk, int optname, sockptr_t optval,
unsigned int optlen, bool is_set);
int (*start)(void);
};
Expand Down
6 changes: 3 additions & 3 deletions net/bpfilter/bpfilter_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,17 @@ static int bpfilter_send_req(struct mbox_request *req)
}

static int bpfilter_process_sockopt(struct sock *sk, int optname,
char __user *optval, unsigned int optlen,
sockptr_t optval, unsigned int optlen,
bool is_set)
{
struct mbox_request req = {
.is_set = is_set,
.pid = current->pid,
.cmd = optname,
.addr = (uintptr_t)optval,
.addr = (uintptr_t)optval.user,
.len = optlen,
};
if (uaccess_kernel()) {
if (uaccess_kernel() || sockptr_is_kernel(optval)) {
pr_err("kernel access not supported\n");
return -EFAULT;
}
Expand Down
8 changes: 4 additions & 4 deletions net/ipv4/bpfilter/sockopt.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ void bpfilter_umh_cleanup(struct umd_info *info)
}
EXPORT_SYMBOL_GPL(bpfilter_umh_cleanup);

static int bpfilter_mbox_request(struct sock *sk, int optname,
char __user *optval,
static int bpfilter_mbox_request(struct sock *sk, int optname, sockptr_t optval,
unsigned int optlen, bool is_set)
{
int err;
Expand Down Expand Up @@ -52,7 +51,7 @@ static int bpfilter_mbox_request(struct sock *sk, int optname,
return err;
}

int bpfilter_ip_set_sockopt(struct sock *sk, int optname, char __user *optval,
int bpfilter_ip_set_sockopt(struct sock *sk, int optname, sockptr_t optval,
unsigned int optlen)
{
return bpfilter_mbox_request(sk, optname, optval, optlen, true);
Expand All @@ -66,7 +65,8 @@ int bpfilter_ip_get_sockopt(struct sock *sk, int optname, char __user *optval,
if (get_user(len, optlen))
return -EFAULT;

return bpfilter_mbox_request(sk, optname, optval, len, false);
return bpfilter_mbox_request(sk, optname, USER_SOCKPTR(optval), len,
false);
}

static int __init bpfilter_sockopt_init(void)
Expand Down
3 changes: 2 additions & 1 deletion net/ipv4/ip_sockglue.c
Original file line number Diff line number Diff line change
Expand Up @@ -1414,7 +1414,8 @@ int ip_setsockopt(struct sock *sk, int level,
#if IS_ENABLED(CONFIG_BPFILTER_UMH)
if (optname >= BPFILTER_IPT_SO_SET_REPLACE &&
optname < BPFILTER_IPT_SET_MAX)
err = bpfilter_ip_set_sockopt(sk, optname, optval, optlen);
err = bpfilter_ip_set_sockopt(sk, optname, USER_SOCKPTR(optval),
optlen);
#endif
#ifdef CONFIG_NETFILTER
/* we need to exclude all possible ENOPROTOOPTs except default case */
Expand Down

0 comments on commit b03afaa

Please sign in to comment.