On Fri, Aug 17, 2018 at 11:26:14PM +0200, Daniel Borkmann wrote: > Commits 109980b894e9 ("bpf: don't select potentially stale ri->map > from buggy xdp progs") and 7c3001313396 ("bpf: fix ri->map_owner > pointer on bpf_prog_realloc") tried to mitigate that buggy programs > using bpf_redirect_map() helper call do not leave stale maps behind. > Idea was to add a map_owner cookie into the per CPU struct redirect_info > which was set to prog->aux by the prog making the helper call as a > proof that the map is not stale since the prog is implicitly holding > a reference to it. This owner cookie could later on get compared with > the program calling into BPF whether they match and therefore the > redirect could proceed with processing the map safely. > > In (obvious) hindsight, this approach breaks down when tail calls are > involved since the original caller's prog->aux pointer does not have > to match the one from one of the progs out of the tail call chain, > and therefore the xdp buffer will be dropped instead of redirected. > A way around that would be to fix the issue differently (which also > allows to remove related work in fast path at the same time): once > the life-time of a redirect map has come to its end we use it's map > free callback where we need to wait on synchronize_rcu() for current > outstanding xdp buffers and remove such a map pointer from the > redirect info if found to be present. At that time no program is > using this map anymore so we simply invalidate the map pointers to > NULL iff they previously pointed to that instance while making sure > that the redirect path only reads out the map once. > > Fixes: 97f91a7cf04f ("bpf: add bpf_redirect_map helper routine") > Fixes: 109980b894e9 ("bpf: don't select potentially stale ri->map from buggy > xdp progs") > Reported-by: Sebastiano Miano <sebastiano.mi...@polito.it> > Signed-off-by: Daniel Borkmann <dan...@iogearbox.net> > Acked-by: John Fastabend <john.fastab...@gmail.com>
Applied, Thanks