Message ID | 20210424221648.809525-1-pctammela@mojatatu.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | [bpf-next] libbpf: handle ENOTSUPP errno in libbpf_strerror() | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for bpf-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | success | CCed 10 of 10 maintainers |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP WARNING: From:/Signed-off-by: email address mismatch: 'From: Pedro Tammela <pctammela@gmail.com>' != 'Signed-off-by: Pedro Tammela <pctammela@mojatatu.com>' |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
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@kernel.org/ > > Signed-off-by: Pedro Tammela <pctammela@mojatatu.com> > --- > 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
Em ter., 27 de abr. de 2021 às 13:18, Daniel Borkmann <daniel@iogearbox.net> 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@kernel.org/ > > > > Signed-off-by: Pedro Tammela <pctammela@mojatatu.com> > > --- > > 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
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;
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/ Signed-off-by: Pedro Tammela <pctammela@mojatatu.com> --- tools/lib/bpf/libbpf_errno.c | 9 +++++++++ 1 file changed, 9 insertions(+)