|
@@ -53,9 +53,10 @@
|
|
|
#include <net/sock_reuseport.h>
|
|
|
|
|
|
/**
|
|
|
- * sk_filter - run a packet through a socket filter
|
|
|
+ * sk_filter_trim_cap - run a packet through a socket filter
|
|
|
* @sk: sock associated with &sk_buff
|
|
|
* @skb: buffer to filter
|
|
|
+ * @cap: limit on how short the eBPF program may trim the packet
|
|
|
*
|
|
|
* Run the eBPF program and then cut skb->data to correct size returned by
|
|
|
* the program. If pkt_len is 0 we toss packet. If skb->len is smaller
|
|
@@ -64,7 +65,7 @@
|
|
|
* be accepted or -EPERM if the packet should be tossed.
|
|
|
*
|
|
|
*/
|
|
|
-int sk_filter(struct sock *sk, struct sk_buff *skb)
|
|
|
+int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap)
|
|
|
{
|
|
|
int err;
|
|
|
struct sk_filter *filter;
|
|
@@ -85,14 +86,13 @@ int sk_filter(struct sock *sk, struct sk_buff *skb)
|
|
|
filter = rcu_dereference(sk->sk_filter);
|
|
|
if (filter) {
|
|
|
unsigned int pkt_len = bpf_prog_run_save_cb(filter->prog, skb);
|
|
|
-
|
|
|
- err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
|
|
|
+ err = pkt_len ? pskb_trim(skb, max(cap, pkt_len)) : -EPERM;
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(sk_filter);
|
|
|
+EXPORT_SYMBOL(sk_filter_trim_cap);
|
|
|
|
|
|
static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5)
|
|
|
{
|