Em ter., 27 de abr. de 2021 às 13:18, Daniel Borkmann <daniel@xxxxxxxxxxxxx> escreveu: > > On 4/25/21 12:16 AM, Pedro Tammela wrote: > > 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@xxxxxxxxxx/ > > > > Signed-off-by: Pedro Tammela <pctammela@xxxxxxxxxxxx> > > --- > > 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