@@ -1139,11 +1139,22 @@ static int bpf_fetch_prog_sec(struct bpf_elf_ctx *ctx, const char *section)
return ret;
}
+static int bpf_find_map_by_id(struct bpf_elf_ctx *ctx, uint32_t id)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(ctx->map_fds); i++)
+ if (ctx->map_fds[i] && ctx->maps[i].id == id &&
+ ctx->maps[i].type == BPF_MAP_TYPE_PROG_ARRAY)
+ return i;
+ return -1;
+}
+
static int bpf_fill_prog_arrays(struct bpf_elf_ctx *ctx)
{
struct bpf_elf_sec_data data;
uint32_t map_id, key_id;
- int fd, i, ret;
+ int fd, i, ret, idx;
for (i = 1; i < ctx->elf_hdr.e_shnum; i++) {
if (ctx->sec_done[i])
@@ -1153,20 +1164,20 @@ static int bpf_fill_prog_arrays(struct bpf_elf_ctx *ctx)
if (ret < 0)
continue;
- ret = sscanf(data.sec_name, "%u/%u", &map_id, &key_id);
- if (ret != 2 || map_id >= ARRAY_SIZE(ctx->map_fds) ||
- !ctx->map_fds[map_id])
+ ret = sscanf(data.sec_name, "%i/%i", &map_id, &key_id);
+ if (ret != 2)
continue;
- if (ctx->maps[map_id].type != BPF_MAP_TYPE_PROG_ARRAY ||
- ctx->maps[map_id].max_elem <= key_id)
+
+ idx = bpf_find_map_by_id(ctx, map_id);
+ if (idx < 0)
continue;
fd = bpf_fetch_prog_sec(ctx, data.sec_name);
if (fd < 0)
return -EIO;
- ret = bpf_map_update(ctx->map_fds[map_id], &key_id,
- &fd, BPF_NOEXIST);
+ ret = bpf_map_update(ctx->map_fds[idx], &key_id,
+ &fd, BPF_ANY);
if (ret < 0)
return -ENOENT;