bpf: allow access into map value arrays
authorJosef Bacik <jbacik@fb.com>
Wed, 28 Sep 2016 14:54:32 +0000 (10:54 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Sep 2016 05:35:35 +0000 (01:35 -0400)
commit484611357c19f9e19ef742ebef4505a07d243cc9
tree34f14c2b2ac71d0bf0a53cab096960e7c91ae87f
parent7836667cec5e02ed2ae3eb09b88047b5b5f2343a
bpf: allow access into map value arrays

Suppose you have a map array value that is something like this

struct foo {
unsigned iter;
int array[SOME_CONSTANT];
};

You can easily insert this into an array, but you cannot modify the contents of
foo->array[] after the fact.  This is because we have no way to verify we won't
go off the end of the array at verification time.  This patch provides a start
for this work.  We accomplish this by keeping track of a minimum and maximum
value a register could be while we're checking the code.  Then at the time we
try to do an access into a MAP_VALUE we verify that the maximum offset into that
region is a valid access into that memory region.  So in practice, code such as
this

unsigned index = 0;

if (foo->iter >= SOME_CONSTANT)
foo->iter = index;
else
index = foo->iter++;
foo->array[index] = bar;

would be allowed, as we can verify that index will always be between 0 and
SOME_CONSTANT-1.  If you wish to use signed values you'll have to have an extra
check to make sure the index isn't less than 0, or do something like index %=
SOME_CONSTANT.

Signed-off-by: Josef Bacik <jbacik@fb.com>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/bpf.h
include/linux/bpf_verifier.h
kernel/bpf/verifier.c
samples/bpf/libbpf.h
samples/bpf/test_verifier.c