lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 192/255] bpftool: Clear errno after libcaps checks
    Date
    From: Quentin Monnet <quentin@isovalent.com>

    [ Upstream commit cea558855c39b7f1f02ff50dcf701ca6596bc964 ]

    When bpftool is linked against libcap, the library runs a "constructor"
    function to compute the number of capabilities of the running kernel
    [0], at the beginning of the execution of the program. As part of this,
    it performs multiple calls to prctl(). Some of these may fail, and set
    errno to a non-zero value:

    # strace -e prctl ./bpftool version
    prctl(PR_CAPBSET_READ, CAP_MAC_OVERRIDE) = 1
    prctl(PR_CAPBSET_READ, 0x30 /* CAP_??? */) = -1 EINVAL (Invalid argument)
    prctl(PR_CAPBSET_READ, CAP_CHECKPOINT_RESTORE) = 1
    prctl(PR_CAPBSET_READ, 0x2c /* CAP_??? */) = -1 EINVAL (Invalid argument)
    prctl(PR_CAPBSET_READ, 0x2a /* CAP_??? */) = -1 EINVAL (Invalid argument)
    prctl(PR_CAPBSET_READ, 0x29 /* CAP_??? */) = -1 EINVAL (Invalid argument)
    ** fprintf added at the top of main(): we have errno == 1
    ./bpftool v7.0.0
    using libbpf v1.0
    features: libbfd, libbpf_strict, skeletons
    +++ exited with 0 +++

    This has been addressed in libcap 2.63 [1], but until this version is
    available everywhere, we can fix it on bpftool side.

    Let's clean errno at the beginning of the main() function, to make sure
    that these checks do not interfere with the batch mode, where we error
    out if errno is set after a bpftool command.

    [0] https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/libcap/cap_alloc.c?h=libcap-2.65#n20
    [1] https://git.kernel.org/pub/scm/libs/libcap/libcap.git/commit/?id=f25a1b7e69f7b33e6afb58b3e38f3450b7d2d9a0

    Signed-off-by: Quentin Monnet <quentin@isovalent.com>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20220815162205.45043-1-quentin@isovalent.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/bpf/bpftool/main.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c
    index 4b03983acbef..35984bd354cb 100644
    --- a/tools/bpf/bpftool/main.c
    +++ b/tools/bpf/bpftool/main.c
    @@ -364,6 +364,16 @@ int main(int argc, char **argv)

    setlinebuf(stdout);

    +#ifdef USE_LIBCAP
    + /* Libcap < 2.63 hooks before main() to compute the number of
    + * capabilities of the running kernel, and doing so it calls prctl()
    + * which may fail and set errno to non-zero.
    + * Let's reset errno to make sure this does not interfere with the
    + * batch mode.
    + */
    + errno = 0;
    +#endif
    +
    last_do_help = do_help;
    pretty_output = false;
    json_output = false;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-24 18:17    [W:2.755 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site