diff options
author | Alexei Starovoitov <ast@plumgrid.com> | 2014-04-22 23:18:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-23 15:34:41 -0400 |
commit | 83d5b7ef99c9f05e87333b334a638de1264ab8e4 (patch) | |
tree | f95ec9cdb441ecfcd32cafe96c1d30a865c9ba35 | |
parent | c06cbcb6052edd8f4ee00d65f874b26404ac8f96 (diff) |
net: filter: initialize A and X registers
exisiting BPF verifier allows uninitialized access to registers,
'ret A' is considered to be a valid filter.
So initialize A and X to zero to prevent leaking kernel memory
In the future BPF verifier will be rejecting such filters
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Cc: Daniel Borkmann <dborkman@redhat.com>
Acked-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/filter.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/net/core/filter.c b/net/core/filter.c index cd58614660cf..9d79ca0a6e8e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -122,6 +122,13 @@ noinline u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5) | |||
122 | return 0; | 122 | return 0; |
123 | } | 123 | } |
124 | 124 | ||
125 | /* Register mappings for user programs. */ | ||
126 | #define A_REG 0 | ||
127 | #define X_REG 7 | ||
128 | #define TMP_REG 8 | ||
129 | #define ARG2_REG 2 | ||
130 | #define ARG3_REG 3 | ||
131 | |||
125 | /** | 132 | /** |
126 | * __sk_run_filter - run a filter on a given context | 133 | * __sk_run_filter - run a filter on a given context |
127 | * @ctx: buffer to run the filter on | 134 | * @ctx: buffer to run the filter on |
@@ -242,6 +249,8 @@ unsigned int __sk_run_filter(void *ctx, const struct sock_filter_int *insn) | |||
242 | 249 | ||
243 | regs[FP_REG] = (u64) (unsigned long) &stack[ARRAY_SIZE(stack)]; | 250 | regs[FP_REG] = (u64) (unsigned long) &stack[ARRAY_SIZE(stack)]; |
244 | regs[ARG1_REG] = (u64) (unsigned long) ctx; | 251 | regs[ARG1_REG] = (u64) (unsigned long) ctx; |
252 | regs[A_REG] = 0; | ||
253 | regs[X_REG] = 0; | ||
245 | 254 | ||
246 | select_insn: | 255 | select_insn: |
247 | goto *jumptable[insn->code]; | 256 | goto *jumptable[insn->code]; |
@@ -643,13 +652,6 @@ static u64 __get_raw_cpu_id(u64 ctx, u64 A, u64 X, u64 r4, u64 r5) | |||
643 | return raw_smp_processor_id(); | 652 | return raw_smp_processor_id(); |
644 | } | 653 | } |
645 | 654 | ||
646 | /* Register mappings for user programs. */ | ||
647 | #define A_REG 0 | ||
648 | #define X_REG 7 | ||
649 | #define TMP_REG 8 | ||
650 | #define ARG2_REG 2 | ||
651 | #define ARG3_REG 3 | ||
652 | |||
653 | static bool convert_bpf_extensions(struct sock_filter *fp, | 655 | static bool convert_bpf_extensions(struct sock_filter *fp, |
654 | struct sock_filter_int **insnp) | 656 | struct sock_filter_int **insnp) |
655 | { | 657 | { |