bpf: map_get_next_key to return first key on NULL
When iterating through a map, we need to find a key that does not exist in the map so map_get_next_key will give us the first key of the map. This often requires a lot of guessing in production systems. This patch makes map_get_next_key return the first key when the key pointer in the parameter is NULL. Signed-off-by: Teng Qin <qinteng@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
472ecf084a
commit
8fe4592438
@@ -321,11 +321,14 @@ TRACE_EVENT(bpf_map_next_key,
|
||||
__dynamic_array(u8, key, map->key_size)
|
||||
__dynamic_array(u8, nxt, map->key_size)
|
||||
__field(bool, key_trunc)
|
||||
__field(bool, key_null)
|
||||
__field(int, ufd)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
memcpy(__get_dynamic_array(key), key, map->key_size);
|
||||
if (key)
|
||||
memcpy(__get_dynamic_array(key), key, map->key_size);
|
||||
__entry->key_null = !key;
|
||||
memcpy(__get_dynamic_array(nxt), key_next, map->key_size);
|
||||
__entry->type = map->map_type;
|
||||
__entry->key_len = min(map->key_size, 16U);
|
||||
@@ -336,8 +339,9 @@ TRACE_EVENT(bpf_map_next_key,
|
||||
TP_printk("map type=%s ufd=%d key=[%s%s] next=[%s%s]",
|
||||
__print_symbolic(__entry->type, __MAP_TYPE_SYM_TAB),
|
||||
__entry->ufd,
|
||||
__print_hex(__get_dynamic_array(key), __entry->key_len),
|
||||
__entry->key_trunc ? " ..." : "",
|
||||
__entry->key_null ? "NULL" : __print_hex(__get_dynamic_array(key),
|
||||
__entry->key_len),
|
||||
__entry->key_trunc && !__entry->key_null ? " ..." : "",
|
||||
__print_hex(__get_dynamic_array(nxt), __entry->key_len),
|
||||
__entry->key_trunc ? " ..." : "")
|
||||
);
|
||||
|
Reference in New Issue
Block a user