Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
[platform/kernel/linux-starfive.git] / net / core / filter.c
index d01a244..7339538 100644 (file)
@@ -1755,25 +1755,27 @@ BPF_CALL_5(bpf_skb_load_bytes_relative, const struct sk_buff *, skb,
           u32, offset, void *, to, u32, len, u32, start_header)
 {
        u8 *end = skb_tail_pointer(skb);
-       u8 *net = skb_network_header(skb);
-       u8 *mac = skb_mac_header(skb);
-       u8 *ptr;
+       u8 *start, *ptr;
 
-       if (unlikely(offset > 0xffff || len > (end - mac)))
+       if (unlikely(offset > 0xffff))
                goto err_clear;
 
        switch (start_header) {
        case BPF_HDR_START_MAC:
-               ptr = mac + offset;
+               if (unlikely(!skb_mac_header_was_set(skb)))
+                       goto err_clear;
+               start = skb_mac_header(skb);
                break;
        case BPF_HDR_START_NET:
-               ptr = net + offset;
+               start = skb_network_header(skb);
                break;
        default:
                goto err_clear;
        }
 
-       if (likely(ptr >= mac && ptr + len <= end)) {
+       ptr = start + offset;
+
+       if (likely(ptr + len <= end)) {
                memcpy(to, ptr, len);
                return 0;
        }
@@ -4340,8 +4342,6 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname,
                        }
                        break;
                case SO_BINDTODEVICE:
-                       ret = -ENOPROTOOPT;
-#ifdef CONFIG_NETDEVICES
                        optlen = min_t(long, optlen, IFNAMSIZ - 1);
                        strncpy(devname, optval, optlen);
                        devname[optlen] = 0;
@@ -4360,7 +4360,6 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname,
                                dev_put(dev);
                        }
                        ret = sock_bindtoindex(sk, ifindex, false);
-#endif
                        break;
                default:
                        ret = -EINVAL;
@@ -5050,7 +5049,7 @@ static int bpf_push_seg6_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len
        int err;
        struct ipv6_sr_hdr *srh = (struct ipv6_sr_hdr *)hdr;
 
-       if (!seg6_validate_srh(srh, len))
+       if (!seg6_validate_srh(srh, len, false))
                return -EINVAL;
 
        switch (type) {