Commit 1884c066 authored by Krzesimir Nowak's avatar Krzesimir Nowak Committed by Daniel Borkmann

tools: bpftool: Fix JSON output when lookup fails

In commit 9a5ab8bf ("tools: bpftool: turn err() and info() macros
into functions") one case of error reporting was special cased, so it
could report a lookup error for a specific key when dumping the map
element. What the code forgot to do is to wrap the key and value keys
into a JSON object, so an example output of pretty JSON dump of a
sockhash map (which does not support looking up its values) is:

[
    "key": ["0x0a","0x41","0x00","0x02","0x1f","0x78","0x00","0x00"
    ],
    "value": {
        "error": "Operation not supported"
    },
    "key": ["0x0a","0x41","0x00","0x02","0x1f","0x78","0x00","0x01"
    ],
    "value": {
        "error": "Operation not supported"
    }
]

Note the key-value pairs inside the toplevel array. They should be
wrapped inside a JSON object, otherwise it is an invalid JSON. This
commit fixes this, so the output now is:

[{
        "key": ["0x0a","0x41","0x00","0x02","0x1f","0x78","0x00","0x00"
        ],
        "value": {
            "error": "Operation not supported"
        }
    },{
        "key": ["0x0a","0x41","0x00","0x02","0x1f","0x78","0x00","0x01"
        ],
        "value": {
            "error": "Operation not supported"
        }
    }
]

Fixes: 9a5ab8bf ("tools: bpftool: turn err() and info() macros into functions")
Cc: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarKrzesimir Nowak <krzesimir@kinvolk.io>
Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 25a7991c
...@@ -716,12 +716,14 @@ static int dump_map_elem(int fd, void *key, void *value, ...@@ -716,12 +716,14 @@ static int dump_map_elem(int fd, void *key, void *value,
return 0; return 0;
if (json_output) { if (json_output) {
jsonw_start_object(json_wtr);
jsonw_name(json_wtr, "key"); jsonw_name(json_wtr, "key");
print_hex_data_json(key, map_info->key_size); print_hex_data_json(key, map_info->key_size);
jsonw_name(json_wtr, "value"); jsonw_name(json_wtr, "value");
jsonw_start_object(json_wtr); jsonw_start_object(json_wtr);
jsonw_string_field(json_wtr, "error", strerror(lookup_errno)); jsonw_string_field(json_wtr, "error", strerror(lookup_errno));
jsonw_end_object(json_wtr); jsonw_end_object(json_wtr);
jsonw_end_object(json_wtr);
} else { } else {
const char *msg = NULL; const char *msg = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment