]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bpf, net: validate struct_ops when updating value.
authorKui-Feng Lee <thinker.li@gmail.com>
Sat, 24 Feb 2024 22:34:16 +0000 (14:34 -0800)
committerMartin KaFai Lau <martin.lau@kernel.org>
Mon, 4 Mar 2024 18:03:57 +0000 (10:03 -0800)
Perform all validations when updating values of struct_ops maps. Doing
validation in st_ops->reg() and st_ops->update() is not necessary anymore.
However, tcp_register_congestion_control() has been called in various
places. It still needs to do validations.

Cc: netdev@vger.kernel.org
Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com>
Link: https://lore.kernel.org/r/20240224223418.526631-2-thinker.li@gmail.com
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
kernel/bpf/bpf_struct_ops.c
net/ipv4/tcp_cong.c

index a6019087b467c2612ee20f8205a3268cc51beb22..07e554c191d1f671f327b6eaf3b52229d5541e0c 100644 (file)
@@ -672,13 +672,14 @@ static long bpf_struct_ops_map_update_elem(struct bpf_map *map, void *key,
                *(unsigned long *)(udata + moff) = prog->aux->id;
        }
 
+       if (st_ops->validate) {
+               err = st_ops->validate(kdata);
+               if (err)
+                       goto reset_unlock;
+       }
+
        if (st_map->map.map_flags & BPF_F_LINK) {
                err = 0;
-               if (st_ops->validate) {
-                       err = st_ops->validate(kdata);
-                       if (err)
-                               goto reset_unlock;
-               }
                arch_protect_bpf_trampoline(st_map->image, PAGE_SIZE);
                /* Let bpf_link handle registration & unregistration.
                 *
index 1b34050a7538be1130fbc84002a7150029fc1c03..28ffcfbeef14e5bb57e62f1610cdf52caaafba89 100644 (file)
@@ -146,11 +146,7 @@ EXPORT_SYMBOL_GPL(tcp_unregister_congestion_control);
 int tcp_update_congestion_control(struct tcp_congestion_ops *ca, struct tcp_congestion_ops *old_ca)
 {
        struct tcp_congestion_ops *existing;
-       int ret;
-
-       ret = tcp_validate_congestion_control(ca);
-       if (ret)
-               return ret;
+       int ret = 0;
 
        ca->key = jhash(ca->name, sizeof(ca->name), strlen(ca->name));