Return-Path: MIME-Version: 1.0 In-Reply-To: References: <20160726000523.11189-1-mathew.j.martineau@linux.intel.com> From: Willem de Bruijn Date: Tue, 26 Jul 2016 13:17:36 -0400 Message-ID: Subject: Re: [PATCH v2] bluetooth, bpf: split sk_filter in l2cap_sock_recv_cb To: Mat Martineau Cc: linux-bluetooth@vger.kernel.org, Daniel Borkmann , Marcel Holtmann , Gustavo Padovan , Alexei Starovoitov Content-Type: text/plain; charset=UTF-8 List-ID: On Tue, Jul 26, 2016 at 1:00 PM, Mat Martineau wrote: > > On Tue, 26 Jul 2016, Willem de Bruijn wrote: > >>> I modified the original patch to call sk_filter for ERTM before the >>> packet is >>> handled by the state machine and to not set the filter locked flag. I >>> tested >>> using l2test in ERTM mode, with and without a "randomly drop 1 in 64 >>> packets" >>> filter attached. >> >> >> Thanks for testing. For consistency's sake, is it preferable to filter >> at this point for all modes? > > > Only ERTM and streaming mode end up on this code path, and I think there's a > benefit to handling these two modes similarly. There are a number of other > paths to l2cap_sock_recv_cb(), and there isn't one perfect place to call > sk_filter for all modes. Okay. > >> >>> >>> Mat >>> >>> --- >>> net/bluetooth/l2cap_core.c | 4 ++++ >>> net/bluetooth/l2cap_sock.c | 13 +++++++++++-- >>> 2 files changed, 15 insertions(+), 2 deletions(-) >>> >>> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c >>> index 54ceb1f..d5de0ce 100644 >>> --- a/net/bluetooth/l2cap_core.c >>> +++ b/net/bluetooth/l2cap_core.c >>> @@ -32,6 +32,7 @@ >>> >>> #include >>> #include >>> +#include >>> >>> #include >>> #include >>> @@ -6610,6 +6611,9 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, >>> struct sk_buff *skb) >>> goto drop; >>> } >>> >>> + if (chan->mode == L2CAP_MODE_ERTM && sk_filter(chan->data, skb)) >>> + goto drop; >>> + >> >> >> sk_filter can also accept, but trim, packets. If the protocol expects >> a header that it unconditionally pulls later, use sk_filter_trim to > > > sk_filter_trim_cap? I see that you added that recently. It's not in > bluetooth-next and we're aiming for a patch that can be easily backported to > stable. > >> avoid trimming to below header length. I think I saw a path from >> >> l2cap_data_rcv >> l2cap_rx >> l2cap_rx_state_recv >> l2cap_reassemble_sdu >> case L2CAP_SAR_START >> skb_pull(skb, L2CAP_SDULEN_SIZE) > > > How about checking skb->len before that skb_pull instead? That works, preferably using pskb_may_pull. The only downside of doing that exactly in this path, is that it is not easy to verify that all other code paths downstream from sk_filter are also safe. If all expect this header, the check is best added right after filter. > > -- > Mat Martineau > Intel OTC