Skip to content

Commit ab214d1

Browse files
Christoph Hellwigdavem330
authored andcommitted
netfilter: switch xt_copy_counters to sockptr_t
Pass a sockptr_t to prepare for set_fs-less handling of the kernel pointer from bpf-cgroup. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7e4b9db commit ab214d1

File tree

5 files changed

+21
-23
lines changed

5 files changed

+21
-23
lines changed

include/linux/netfilter/x_tables.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ int xt_target_to_user(const struct xt_entry_target *t,
301301
int xt_data_to_user(void __user *dst, const void *src,
302302
int usersize, int size, int aligned_size);
303303

304-
void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
305-
struct xt_counters_info *info);
304+
void *xt_copy_counters(sockptr_t arg, unsigned int len,
305+
struct xt_counters_info *info);
306306
struct xt_counters *xt_counters_alloc(unsigned int counters);
307307

308308
struct xt_table *xt_register_table(struct net *net,

net/ipv4/netfilter/arp_tables.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -996,8 +996,7 @@ static int do_replace(struct net *net, const void __user *user,
996996
return ret;
997997
}
998998

999-
static int do_add_counters(struct net *net, const void __user *user,
1000-
unsigned int len)
999+
static int do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
10011000
{
10021001
unsigned int i;
10031002
struct xt_counters_info tmp;
@@ -1008,7 +1007,7 @@ static int do_add_counters(struct net *net, const void __user *user,
10081007
struct arpt_entry *iter;
10091008
unsigned int addend;
10101009

1011-
paddc = xt_copy_counters_from_user(user, len, &tmp);
1010+
paddc = xt_copy_counters(arg, len, &tmp);
10121011
if (IS_ERR(paddc))
10131012
return PTR_ERR(paddc);
10141013

@@ -1420,7 +1419,7 @@ static int do_arpt_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned
14201419
break;
14211420

14221421
case ARPT_SO_SET_ADD_COUNTERS:
1423-
ret = do_add_counters(sock_net(sk), user, len);
1422+
ret = do_add_counters(sock_net(sk), USER_SOCKPTR(user), len);
14241423
break;
14251424

14261425
default:

net/ipv4/netfilter/ip_tables.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,8 +1151,7 @@ do_replace(struct net *net, const void __user *user, unsigned int len)
11511151
}
11521152

11531153
static int
1154-
do_add_counters(struct net *net, const void __user *user,
1155-
unsigned int len)
1154+
do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
11561155
{
11571156
unsigned int i;
11581157
struct xt_counters_info tmp;
@@ -1163,7 +1162,7 @@ do_add_counters(struct net *net, const void __user *user,
11631162
struct ipt_entry *iter;
11641163
unsigned int addend;
11651164

1166-
paddc = xt_copy_counters_from_user(user, len, &tmp);
1165+
paddc = xt_copy_counters(arg, len, &tmp);
11671166
if (IS_ERR(paddc))
11681167
return PTR_ERR(paddc);
11691168

@@ -1629,7 +1628,7 @@ do_ipt_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
16291628
break;
16301629

16311630
case IPT_SO_SET_ADD_COUNTERS:
1632-
ret = do_add_counters(sock_net(sk), user, len);
1631+
ret = do_add_counters(sock_net(sk), USER_SOCKPTR(user), len);
16331632
break;
16341633

16351634
default:

net/ipv6/netfilter/ip6_tables.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ do_replace(struct net *net, const void __user *user, unsigned int len)
11681168
}
11691169

11701170
static int
1171-
do_add_counters(struct net *net, const void __user *user, unsigned int len)
1171+
do_add_counters(struct net *net, sockptr_t arg, unsigned int len)
11721172
{
11731173
unsigned int i;
11741174
struct xt_counters_info tmp;
@@ -1179,7 +1179,7 @@ do_add_counters(struct net *net, const void __user *user, unsigned int len)
11791179
struct ip6t_entry *iter;
11801180
unsigned int addend;
11811181

1182-
paddc = xt_copy_counters_from_user(user, len, &tmp);
1182+
paddc = xt_copy_counters(arg, len, &tmp);
11831183
if (IS_ERR(paddc))
11841184
return PTR_ERR(paddc);
11851185
t = xt_find_table_lock(net, AF_INET6, tmp.name);
@@ -1637,7 +1637,7 @@ do_ip6t_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
16371637
break;
16381638

16391639
case IP6T_SO_SET_ADD_COUNTERS:
1640-
ret = do_add_counters(sock_net(sk), user, len);
1640+
ret = do_add_counters(sock_net(sk), USER_SOCKPTR(user), len);
16411641
break;
16421642

16431643
default:

net/netfilter/x_tables.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,9 +1028,9 @@ int xt_check_target(struct xt_tgchk_param *par,
10281028
EXPORT_SYMBOL_GPL(xt_check_target);
10291029

10301030
/**
1031-
* xt_copy_counters_from_user - copy counters and metadata from userspace
1031+
* xt_copy_counters - copy counters and metadata from a sockptr_t
10321032
*
1033-
* @user: src pointer to userspace memory
1033+
* @arg: src sockptr
10341034
* @len: alleged size of userspace memory
10351035
* @info: where to store the xt_counters_info metadata
10361036
*
@@ -1047,8 +1047,8 @@ EXPORT_SYMBOL_GPL(xt_check_target);
10471047
* Return: returns pointer that caller has to test via IS_ERR().
10481048
* If IS_ERR is false, caller has to vfree the pointer.
10491049
*/
1050-
void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
1051-
struct xt_counters_info *info)
1050+
void *xt_copy_counters(sockptr_t arg, unsigned int len,
1051+
struct xt_counters_info *info)
10521052
{
10531053
void *mem;
10541054
u64 size;
@@ -1062,23 +1062,23 @@ void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
10621062
return ERR_PTR(-EINVAL);
10631063

10641064
len -= sizeof(compat_tmp);
1065-
if (copy_from_user(&compat_tmp, user, sizeof(compat_tmp)) != 0)
1065+
if (copy_from_sockptr(&compat_tmp, arg, sizeof(compat_tmp)) != 0)
10661066
return ERR_PTR(-EFAULT);
10671067

10681068
memcpy(info->name, compat_tmp.name, sizeof(info->name) - 1);
10691069
info->num_counters = compat_tmp.num_counters;
1070-
user += sizeof(compat_tmp);
1070+
sockptr_advance(arg, sizeof(compat_tmp));
10711071
} else
10721072
#endif
10731073
{
10741074
if (len <= sizeof(*info))
10751075
return ERR_PTR(-EINVAL);
10761076

10771077
len -= sizeof(*info);
1078-
if (copy_from_user(info, user, sizeof(*info)) != 0)
1078+
if (copy_from_sockptr(info, arg, sizeof(*info)) != 0)
10791079
return ERR_PTR(-EFAULT);
10801080

1081-
user += sizeof(*info);
1081+
sockptr_advance(arg, sizeof(*info));
10821082
}
10831083
info->name[sizeof(info->name) - 1] = '\0';
10841084

@@ -1092,13 +1092,13 @@ void *xt_copy_counters_from_user(const void __user *user, unsigned int len,
10921092
if (!mem)
10931093
return ERR_PTR(-ENOMEM);
10941094

1095-
if (copy_from_user(mem, user, len) == 0)
1095+
if (copy_from_sockptr(mem, arg, len) == 0)
10961096
return mem;
10971097

10981098
vfree(mem);
10991099
return ERR_PTR(-EFAULT);
11001100
}
1101-
EXPORT_SYMBOL_GPL(xt_copy_counters_from_user);
1101+
EXPORT_SYMBOL_GPL(xt_copy_counters);
11021102

11031103
#ifdef CONFIG_COMPAT
11041104
int xt_compat_target_offset(const struct xt_target *target)

0 commit comments

Comments
 (0)