diff options
| author | Andrii Nakryiko <[email protected]> | 2022-08-10 18:34:25 +0000 |
|---|---|---|
| committer | Alexei Starovoitov <[email protected]> | 2022-08-10 18:47:29 +0000 |
| commit | d7c5802faff6e7f50d18db40fdcb7e50590177f5 (patch) | |
| tree | 53a459f9da5f0444d3d5260e273c62285c1efff3 /tools/lib/bpf/libbpf.c | |
| parent | Merge branch 'destructive bpf_kfuncs' (diff) | |
| download | kernel-d7c5802faff6e7f50d18db40fdcb7e50590177f5.tar.gz kernel-d7c5802faff6e7f50d18db40fdcb7e50590177f5.zip | |
libbpf: preserve errno across pr_warn/pr_info/pr_debug
As suggested in [0], make sure that libbpf_print saves and restored
errno and as such guaranteed that no matter what actual print callback
user installs, macros like pr_warn/pr_info/pr_debug are completely
transparent as far as errno goes.
While libbpf code is pretty careful about not clobbering important errno
values accidentally with pr_warn(), it's a trivial change to make sure
that pr_warn can be used anywhere without a risk of clobbering errno.
No functional changes, just future proofing.
[0] https://github.com/libbpf/libbpf/pull/536
Signed-off-by: Andrii Nakryiko <[email protected]>
Acked-by: Daniel Müller <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Alexei Starovoitov <[email protected]>
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index f7364ea82ac1..917d975bd4c6 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -223,13 +223,18 @@ __printf(2, 3) void libbpf_print(enum libbpf_print_level level, const char *format, ...) { va_list args; + int old_errno; if (!__libbpf_pr) return; + old_errno = errno; + va_start(args, format); __libbpf_pr(level, format, args); va_end(args); + + errno = old_errno; } static void pr_perm_msg(int err) |
