aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf/cgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bpf/cgroup.c')
-rw-r--r--kernel/bpf/cgroup.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
index 6a6a154cfa7b..ddd8addcdb5c 100644
--- a/kernel/bpf/cgroup.c
+++ b/kernel/bpf/cgroup.c
@@ -1334,6 +1334,7 @@ static u32 sysctl_convert_ctx_access(enum bpf_access_type type,
1334 struct bpf_prog *prog, u32 *target_size) 1334 struct bpf_prog *prog, u32 *target_size)
1335{ 1335{
1336 struct bpf_insn *insn = insn_buf; 1336 struct bpf_insn *insn = insn_buf;
1337 u32 read_size;
1337 1338
1338 switch (si->off) { 1339 switch (si->off) {
1339 case offsetof(struct bpf_sysctl, write): 1340 case offsetof(struct bpf_sysctl, write):
@@ -1365,7 +1366,9 @@ static u32 sysctl_convert_ctx_access(enum bpf_access_type type,
1365 treg, si->dst_reg, 1366 treg, si->dst_reg,
1366 offsetof(struct bpf_sysctl_kern, ppos)); 1367 offsetof(struct bpf_sysctl_kern, ppos));
1367 *insn++ = BPF_STX_MEM( 1368 *insn++ = BPF_STX_MEM(
1368 BPF_SIZEOF(u32), treg, si->src_reg, 0); 1369 BPF_SIZEOF(u32), treg, si->src_reg,
1370 bpf_ctx_narrow_access_offset(
1371 0, sizeof(u32), sizeof(loff_t)));
1369 *insn++ = BPF_LDX_MEM( 1372 *insn++ = BPF_LDX_MEM(
1370 BPF_DW, treg, si->dst_reg, 1373 BPF_DW, treg, si->dst_reg,
1371 offsetof(struct bpf_sysctl_kern, tmp_reg)); 1374 offsetof(struct bpf_sysctl_kern, tmp_reg));
@@ -1374,8 +1377,11 @@ static u32 sysctl_convert_ctx_access(enum bpf_access_type type,
1374 BPF_FIELD_SIZEOF(struct bpf_sysctl_kern, ppos), 1377 BPF_FIELD_SIZEOF(struct bpf_sysctl_kern, ppos),
1375 si->dst_reg, si->src_reg, 1378 si->dst_reg, si->src_reg,
1376 offsetof(struct bpf_sysctl_kern, ppos)); 1379 offsetof(struct bpf_sysctl_kern, ppos));
1380 read_size = bpf_size_to_bytes(BPF_SIZE(si->code));
1377 *insn++ = BPF_LDX_MEM( 1381 *insn++ = BPF_LDX_MEM(
1378 BPF_SIZE(si->code), si->dst_reg, si->dst_reg, 0); 1382 BPF_SIZE(si->code), si->dst_reg, si->dst_reg,
1383 bpf_ctx_narrow_access_offset(
1384 0, read_size, sizeof(loff_t)));
1379 } 1385 }
1380 *target_size = sizeof(u32); 1386 *target_size = sizeof(u32);
1381 break; 1387 break;