Re: [PATCH bpf-next] libbpf: handle ENOTSUPP errno in libbpf_strerror()
From: Pedro Tammela <hidden>
Date: 2021-04-30 14:17:11
Also in:
bpf, lkml
Em ter., 27 de abr. de 2021 às 13:18, Daniel Borkmann [off-list ref] escreveu:
On 4/25/21 12:16 AM, Pedro Tammela wrote:quoted
The 'bpf()' syscall is leaking the ENOTSUPP errno that is internal to the kernel[1]. More recent code is already using the correct EOPNOTSUPP, but changing older return codes is not possible due to dependency concerns, so handle ENOTSUPP in libbpf_strerror(). [1] https://lore.kernel.org/netdev/20200511165319.2251678-1-kuba@kernel.org/ (local) Signed-off-by: Pedro Tammela <redacted> --- tools/lib/bpf/libbpf_errno.c | 9 +++++++++ 1 file changed, 9 insertions(+)diff --git a/tools/lib/bpf/libbpf_errno.c b/tools/lib/bpf/libbpf_errno.c index 0afb51f7a919..7de8bbc34a37 100644 --- a/tools/lib/bpf/libbpf_errno.c +++ b/tools/lib/bpf/libbpf_errno.c@@ -13,6 +13,9 @@ #include "libbpf.h" +/* This errno is internal to the kernel but leaks in the bpf() syscall. */ +#define ENOTSUPP 524 + /* make sure libbpf doesn't use kernel-only integer typedefs */ #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64@@ -43,6 +46,12 @@ int libbpf_strerror(int err, char *buf, size_t size) err = err > 0 ? err : -err; + if (err == ENOTSUPP) { + snprintf(buf, size, "Operation not supported"); + buf[size - 1] = '\0'; + return 0; + } + if (err < __LIBBPF_ERRNO__START) { int ret;Could you fold this into the __LIBBPF_ERRNO__START test body to denote that it belongs outside the libbpf error range? For example, could be simplified like this: if (err < __LIBBPF_ERRNO__START) { int ret; /* Handle ENOTSUPP separate here given it's kernel internal, * but for sake of error string it has the same meaning as * the EOPNOTSUPP error. */ if (err == ENOTSUPP) err = EOPNOTSUPP; ret = strerror_r(err, buf, size); buf[size - 1] = '\0'; return ret; } Thanks, Daniel
Sure, looks simpler indeed. Pedro