mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 08:44:14 +08:00
bpftool: Print as a string for char array
A char[] is currently printed as an integer array. This patch will print it as a string when 1) The array element type is an one byte int 2) The array element type has a BTF_INT_CHAR encoding or the array element type's name is "char" 3) All characters is between (0x1f, 0x7f) and it is terminated by a null character. Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/20200318171643.129021-1-kafai@fb.com
This commit is contained in:
parent
ca7e6e45d1
commit
30255d3175
@ -81,6 +81,42 @@ static int btf_dumper_enum(const struct btf_dumper *d,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool is_str_array(const struct btf *btf, const struct btf_array *arr,
|
||||
const char *s)
|
||||
{
|
||||
const struct btf_type *elem_type;
|
||||
const char *end_s;
|
||||
|
||||
if (!arr->nelems)
|
||||
return false;
|
||||
|
||||
elem_type = btf__type_by_id(btf, arr->type);
|
||||
/* Not skipping typedef. typedef to char does not count as
|
||||
* a string now.
|
||||
*/
|
||||
while (elem_type && btf_is_mod(elem_type))
|
||||
elem_type = btf__type_by_id(btf, elem_type->type);
|
||||
|
||||
if (!elem_type || !btf_is_int(elem_type) || elem_type->size != 1)
|
||||
return false;
|
||||
|
||||
if (btf_int_encoding(elem_type) != BTF_INT_CHAR &&
|
||||
strcmp("char", btf__name_by_offset(btf, elem_type->name_off)))
|
||||
return false;
|
||||
|
||||
end_s = s + arr->nelems;
|
||||
while (s < end_s) {
|
||||
if (!*s)
|
||||
return true;
|
||||
if (*s <= 0x1f || *s >= 0x7f)
|
||||
return false;
|
||||
s++;
|
||||
}
|
||||
|
||||
/* '\0' is not found */
|
||||
return false;
|
||||
}
|
||||
|
||||
static int btf_dumper_array(const struct btf_dumper *d, __u32 type_id,
|
||||
const void *data)
|
||||
{
|
||||
@ -90,6 +126,11 @@ static int btf_dumper_array(const struct btf_dumper *d, __u32 type_id,
|
||||
int ret = 0;
|
||||
__u32 i;
|
||||
|
||||
if (is_str_array(d->btf, arr, data)) {
|
||||
jsonw_string(d->jw, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
elem_size = btf__resolve_size(d->btf, arr->type);
|
||||
if (elem_size < 0)
|
||||
return elem_size;
|
||||
|
Loading…
Reference in New Issue
Block a user