Loading include/linux/bpfilter.h +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); }; Loading net/bpfilter/bpfilter_kern.c +3 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading net/ipv4/bpfilter/sockopt.c +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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) Loading net/ipv4/ip_sockglue.c +2 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading
include/linux/bpfilter.h +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); }; Loading
net/bpfilter/bpfilter_kern.c +3 −3 Original line number Diff line number Diff line Loading @@ -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; } Loading
net/ipv4/bpfilter/sockopt.c +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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) Loading
net/ipv4/ip_sockglue.c +2 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading