* [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2"
@ 2018-07-25 7:21 Thomas Richter
2018-07-26 1:48 ` Jakub Kicinski
0 siblings, 1 reply; 6+ messages in thread
From: Thomas Richter @ 2018-07-25 7:21 UTC (permalink / raw)
To: daniel, ast, netdev, linux-kernel
Cc: heiko.carstens, brueckner, schwidefsky, wangnan0, Thomas Richter
commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections")
causes a compiler error when building the perf tool in the linux-next tree.
I compile it using a FEDORA 28 installation, my gcc compiler version:
gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20)
The file that causes the error is tools/lib/bpf/libbpf.c
Here is the error message:
[root@p23lp27] # make V=1 EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2"
[...]
make -f /home6/tmricht/linux-next/tools/build/Makefile.build
dir=./util/scripting-engines obj=libperf
libbpf.c: In function ‘bpf_object__elf_collect’:
libbpf.c:811:15: error: ignoring return value of ‘strerror_r’,
declared with attribute warn_unused_result [-Werror=unused-result]
strerror_r(-err, errmsg, sizeof(errmsg));
^
cc1: all warnings being treated as errors
mv: cannot stat './.libbpf.o.tmp': No such file or directory
/home6/tmricht/linux-next/tools/build/Makefile.build:96: recipe for target 'libbpf.o' failed
Since this is the only occurance of strerror_r() replace it
by strerror(). The additional functionality of strerror_r() to
copy the error message into the supplied buffer is not needed.
This is also consistant with all the other pr_warning() statements
in this file which all use strerror().
Also fixes a possible initialization issue.
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
---
tools/lib/bpf/libbpf.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 955f8eafbf41..f9eb68ff2f4f 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -806,11 +806,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
err = bpf_object__add_program(obj, data->d_buf,
data->d_size, name, idx);
if (err) {
- char errmsg[STRERR_BUFSIZE];
-
- strerror_r(-err, errmsg, sizeof(errmsg));
pr_warning("failed to alloc program %s (%s): %s",
- name, obj->path, errmsg);
+ name, obj->path, strerror(-err));
}
} else if (sh.sh_type == SHT_REL) {
void *reloc = obj->efile.reloc;
@@ -2334,7 +2331,7 @@ bpf_perf_event_read_simple(void *mem, unsigned long size,
__u64 data_tail = header->data_tail;
__u64 data_head = header->data_head;
void *base, *begin, *end;
- int ret;
+ int ret = 0;
asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */
if (data_head == data_tail)
--
2.16.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" 2018-07-25 7:21 [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" Thomas Richter @ 2018-07-26 1:48 ` Jakub Kicinski 2018-07-27 2:16 ` Daniel Borkmann 0 siblings, 1 reply; 6+ messages in thread From: Jakub Kicinski @ 2018-07-26 1:48 UTC (permalink / raw) To: Thomas Richter Cc: daniel, ast, netdev, linux-kernel, heiko.carstens, brueckner, schwidefsky, wangnan0 On Wed, 25 Jul 2018 09:21:26 +0200, Thomas Richter wrote: > commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections") Hmm.. are you sure it's not 531b014e7a2f ("tools: bpf: make use of reallocarray") that caused the issue? That commit made us switch from XSI-compliant to GNU-specific strerror_r() implementation.. /me checks Yes it looks like 531b014e7a2f~ builds just fine. Daniel, did you try to apply v1 to the bpf tree? Perhaps there is a confusion about the trees here, if this is caused by my recent change it's a bpf-next material. strerror() works, but strerror_r() seems nicer, so perhaps we could keep it if the patch worked in bpf-next? > causes a compiler error when building the perf tool in the linux-next tree. > I compile it using a FEDORA 28 installation, my gcc compiler version: > gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) > > The file that causes the error is tools/lib/bpf/libbpf.c > > Here is the error message: > > [root@p23lp27] # make V=1 EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" > [...] > make -f /home6/tmricht/linux-next/tools/build/Makefile.build > dir=./util/scripting-engines obj=libperf > libbpf.c: In function ‘bpf_object__elf_collect’: > libbpf.c:811:15: error: ignoring return value of ‘strerror_r’, > declared with attribute warn_unused_result [-Werror=unused-result] > strerror_r(-err, errmsg, sizeof(errmsg)); > ^ > cc1: all warnings being treated as errors > mv: cannot stat './.libbpf.o.tmp': No such file or directory > /home6/tmricht/linux-next/tools/build/Makefile.build:96: recipe for target 'libbpf.o' failed > > Since this is the only occurance of strerror_r() replace it > by strerror(). The additional functionality of strerror_r() to > copy the error message into the supplied buffer is not needed. > This is also consistant with all the other pr_warning() statements > in this file which all use strerror(). > > Also fixes a possible initialization issue. > > Cc: Wang Nan <wangnan0@huawei.com> > Cc: Alexei Starovoitov <ast@kernel.org> > Cc: Daniel Borkmann <daniel@iogearbox.net> > Signed-off-by: Thomas Richter <tmricht@linux.ibm.com> > > tools/lib/bpf/libbpf.c | 7 ++----- > 1 file changed, 2 insertions(+), 5 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 955f8eafbf41..f9eb68ff2f4f 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -806,11 +806,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj) > err = bpf_object__add_program(obj, data->d_buf, > data->d_size, name, idx); > if (err) { > - char errmsg[STRERR_BUFSIZE]; > - > - strerror_r(-err, errmsg, sizeof(errmsg)); > pr_warning("failed to alloc program %s (%s): %s", > - name, obj->path, errmsg); > + name, obj->path, strerror(-err)); > } > } else if (sh.sh_type == SHT_REL) { > void *reloc = obj->efile.reloc; > @@ -2334,7 +2331,7 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, > __u64 data_tail = header->data_tail; > __u64 data_head = header->data_head; > void *base, *begin, *end; > - int ret; > + int ret = 0; > > asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */ > if (data_head == data_tail) This looks like a separate issue. The ret variable should really be enum bpf_perf_event_ret, so could you please initialize it to one of the values of this enum? The uninitilized condition can only happen if (data_head != data_tail) but at the same time (data_head % size == data_tail % size) which should never really happen... Perhaps initializing to LIBBPF_PERF_EVENT_ERROR would make sense? Or better still adding: diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index f732237610e5..fa5a25945f19 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -2289,6 +2289,8 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, begin = base + data_tail % size; end = base + data_head % size; + if (being == end) + return LIBBPF_PERF_EVENT_ERROR; while (begin != end) { struct perf_event_header *ehdr; ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" 2018-07-26 1:48 ` Jakub Kicinski @ 2018-07-27 2:16 ` Daniel Borkmann 2018-07-27 7:22 ` Thomas-Mich Richter 0 siblings, 1 reply; 6+ messages in thread From: Daniel Borkmann @ 2018-07-27 2:16 UTC (permalink / raw) To: Jakub Kicinski, Thomas Richter Cc: ast, netdev, linux-kernel, heiko.carstens, brueckner, schwidefsky, wangnan0 On 07/26/2018 03:48 AM, Jakub Kicinski wrote: > On Wed, 25 Jul 2018 09:21:26 +0200, Thomas Richter wrote: >> commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections") > > Hmm.. are you sure it's not 531b014e7a2f ("tools: bpf: make use of > reallocarray") that caused the issue? That commit made us switch from > XSI-compliant to GNU-specific strerror_r() implementation.. > > /me checks > > Yes it looks like 531b014e7a2f~ builds just fine. > > Daniel, did you try to apply v1 to the bpf tree? Perhaps there is a > confusion about the trees here, if this is caused by my recent change > it's a bpf-next material. strerror() works, but strerror_r() seems > nicer, so perhaps we could keep it if the patch worked in bpf-next? Yeah indeed, the issue is only in bpf-next. When I compile libbpf from bpf tree with the below flags then it's all good. Agree that we should rather use strerror_r() given this is a library. >> causes a compiler error when building the perf tool in the linux-next tree. >> I compile it using a FEDORA 28 installation, my gcc compiler version: >> gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) >> >> The file that causes the error is tools/lib/bpf/libbpf.c >> >> Here is the error message: [...] >> @@ -2334,7 +2331,7 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, >> __u64 data_tail = header->data_tail; >> __u64 data_head = header->data_head; >> void *base, *begin, *end; >> - int ret; >> + int ret = 0; >> >> asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */ >> if (data_head == data_tail) > > This looks like a separate issue. The ret variable should really be > enum bpf_perf_event_ret, so could you please initialize it to one of the > values of this enum? > > The uninitilized condition can only happen if (data_head != data_tail) > but at the same time (data_head % size == data_tail % size) which > should never really happen... Perhaps initializing to > LIBBPF_PERF_EVENT_ERROR would make sense? > > Or better still adding: > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index f732237610e5..fa5a25945f19 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -2289,6 +2289,8 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, > > begin = base + data_tail % size; > end = base + data_head % size; > + if (being == end) > + return LIBBPF_PERF_EVENT_ERROR; Sounds good to me. > while (begin != end) { > struct perf_event_header *ehdr; > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" 2018-07-27 2:16 ` Daniel Borkmann @ 2018-07-27 7:22 ` Thomas-Mich Richter 2018-07-27 17:57 ` Jakub Kicinski 0 siblings, 1 reply; 6+ messages in thread From: Thomas-Mich Richter @ 2018-07-27 7:22 UTC (permalink / raw) To: Daniel Borkmann, Jakub Kicinski Cc: ast, netdev, linux-kernel, heiko.carstens, brueckner, schwidefsky, wangnan0 On 07/27/2018 04:16 AM, Daniel Borkmann wrote: > On 07/26/2018 03:48 AM, Jakub Kicinski wrote: >> On Wed, 25 Jul 2018 09:21:26 +0200, Thomas Richter wrote: >>> commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections") >> >> Hmm.. are you sure it's not 531b014e7a2f ("tools: bpf: make use of >> reallocarray") that caused the issue? That commit made us switch from >> XSI-compliant to GNU-specific strerror_r() implementation.. >> >> /me checks >> >> Yes it looks like 531b014e7a2f~ builds just fine. >> >> Daniel, did you try to apply v1 to the bpf tree? Perhaps there is a >> confusion about the trees here, if this is caused by my recent change >> it's a bpf-next material. strerror() works, but strerror_r() seems >> nicer, so perhaps we could keep it if the patch worked in bpf-next? > > Yeah indeed, the issue is only in bpf-next. When I compile libbpf from > bpf tree with the below flags then it's all good> > Agree that we should rather use strerror_r() given this is a library. Are you sure to stick with strerror_r? I ask because it is the only occurence of strerror_r in this file. All other error messages use strerror as in: pr_warning("failed to create map (name: '%s'): %s\n", map->name, strerror(errno)); $ fgrep strerror tools/lib/bpf/libbpf.c strerror(errno)); issue I try to solve---> strerror_r(-err, errmsg, sizeof(errmsg)); map->name, strerror(errno), errno); strerror(errno)); pr_warning("load bpf program failed: %s\n", strerror(errno)); pr_warning("failed to statfs %s: %s\n", dir, strerror(errno)); pr_warning("failed to pin program: %s\n", strerror(errno)); pr_warning("failed to mkdir %s: %s\n", path, strerror(-err)); pr_warning("failed to pin map: %s\n", strerror(errno)); $ The next issue with strerror_r is to assign the return value to a variable. Then we end up with variable set but not used: libbpf.c: In function ‘bpf_object__elf_collect’: libbpf.c:809:35: error: variable ‘cp’ set but not used [-Werror=unused-but-set-variable] char errmsg[STRERR_BUFSIZE], *cp; ^ cc1: all warnings being treated as errors Here is the source: if (err) { char errmsg[STRERR_BUFSIZE], *cp; cp = strerror_r(-err, errmsg, sizeof(errmsg)); pr_warning("failed to alloc program %s (%s): %s", name, obj->path, errmsg); } To fix this requires something like: pr_warning("failed to alloc program %s (%s): %s", name, obj->path, cp); And after pr_warning() is done, the local array errmsg is deleted. A lot of overkill in my opinion, unless I miss something. >>> causes a compiler error when building the perf tool in the linux-next tree. >>> I compile it using a FEDORA 28 installation, my gcc compiler version: >>> gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) >>> >>> The file that causes the error is tools/lib/bpf/libbpf.c >>> >>> Here is the error message: > [...] >>> @@ -2334,7 +2331,7 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, >>> __u64 data_tail = header->data_tail; >>> __u64 data_head = header->data_head; >>> void *base, *begin, *end; >>> - int ret; >>> + int ret = 0; >>> >>> asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */ >>> if (data_head == data_tail) >> >> This looks like a separate issue. The ret variable should really be >> enum bpf_perf_event_ret, so could you please initialize it to one of the >> values of this enum? >> >> The uninitilized condition can only happen if (data_head != data_tail) >> but at the same time (data_head % size == data_tail % size) which >> should never really happen... Perhaps initializing to >> LIBBPF_PERF_EVENT_ERROR would make sense? >> >> Or better still adding: >> >> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c >> index f732237610e5..fa5a25945f19 100644 >> --- a/tools/lib/bpf/libbpf.c >> +++ b/tools/lib/bpf/libbpf.c >> @@ -2289,6 +2289,8 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, >> >> begin = base + data_tail % size; >> end = base + data_head % size; >> + if (being == end) >> + return LIBBPF_PERF_EVENT_ERROR; > > Sounds good to me. > If you want I can send you a separate patch for this. -- Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" 2018-07-27 7:22 ` Thomas-Mich Richter @ 2018-07-27 17:57 ` Jakub Kicinski 2018-07-27 18:29 ` Daniel Borkmann 0 siblings, 1 reply; 6+ messages in thread From: Jakub Kicinski @ 2018-07-27 17:57 UTC (permalink / raw) To: Thomas-Mich Richter Cc: Daniel Borkmann, ast, netdev, linux-kernel, heiko.carstens, brueckner, schwidefsky, wangnan0 On Fri, 27 Jul 2018 09:22:03 +0200, Thomas-Mich Richter wrote: > On 07/27/2018 04:16 AM, Daniel Borkmann wrote: > > On 07/26/2018 03:48 AM, Jakub Kicinski wrote: > >> On Wed, 25 Jul 2018 09:21:26 +0200, Thomas Richter wrote: > >>> commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections") > >> > >> Hmm.. are you sure it's not 531b014e7a2f ("tools: bpf: make use of > >> reallocarray") that caused the issue? That commit made us switch from > >> XSI-compliant to GNU-specific strerror_r() implementation.. > >> > >> /me checks > >> > >> Yes it looks like 531b014e7a2f~ builds just fine. > >> > >> Daniel, did you try to apply v1 to the bpf tree? Perhaps there is a > >> confusion about the trees here, if this is caused by my recent change > >> it's a bpf-next material. strerror() works, but strerror_r() seems > >> nicer, so perhaps we could keep it if the patch worked in bpf-next? > > > > Yeah indeed, the issue is only in bpf-next. When I compile libbpf from > > bpf tree with the below flags then it's all good> > > Agree that we should rather use strerror_r() given this is a library. > > Are you sure to stick with strerror_r? I ask because it is the only > occurence of strerror_r in this file. All other error messages use strerror > as in: > pr_warning("failed to create map (name: '%s'): %s\n", > map->name, > strerror(errno)); > > > $ fgrep strerror tools/lib/bpf/libbpf.c > strerror(errno)); > issue I try to solve---> strerror_r(-err, errmsg, sizeof(errmsg)); > map->name, strerror(errno), errno); > strerror(errno)); > pr_warning("load bpf program failed: %s\n", strerror(errno)); > pr_warning("failed to statfs %s: %s\n", dir, strerror(errno)); > pr_warning("failed to pin program: %s\n", strerror(errno)); > pr_warning("failed to mkdir %s: %s\n", path, strerror(-err)); > pr_warning("failed to pin map: %s\n", strerror(errno)); > $ > > The next issue with strerror_r is to assign the return value to a variable. > Then we end up with variable set but not used: > libbpf.c: In function ‘bpf_object__elf_collect’: > libbpf.c:809:35: error: variable ‘cp’ set but not used [-Werror=unused-but-set-variable] > char errmsg[STRERR_BUFSIZE], *cp; > ^ > cc1: all warnings being treated as errors The GNU-specific strerror_r() returns a pointer to a string containing the error message. This may be either a pointer to a string that the function stores in buf, or a pointer to some (immutable) static string (in which case buf is unused). If the function stores a string in buf, then at most buflen bytes are stored (the string may be truncated if buflen is too small and errnum is unknown). The string always includes a terminating null byte ('\0'). IOW you gotta use the return value. > Here is the source: > if (err) { > char errmsg[STRERR_BUFSIZE], *cp; > > cp = strerror_r(-err, errmsg, sizeof(errmsg)); > pr_warning("failed to alloc program %s (%s): %s", > name, obj->path, errmsg); > } > > To fix this requires something like: > pr_warning("failed to alloc program %s (%s): %s", > name, obj->path, cp); This looks correct. > And after pr_warning() is done, the local array errmsg is deleted. > > A lot of overkill in my opinion, unless I miss something. IMO using potentially mutli-thread unsafe functions in a library is not optimal, we should strive to convert the other instances of strerror() rather than move the other way. > >>> causes a compiler error when building the perf tool in the linux-next tree. > >>> I compile it using a FEDORA 28 installation, my gcc compiler version: > >>> gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) > >>> > >>> The file that causes the error is tools/lib/bpf/libbpf.c > >>> > >>> Here is the error message: > > [...] > >>> @@ -2334,7 +2331,7 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, > >>> __u64 data_tail = header->data_tail; > >>> __u64 data_head = header->data_head; > >>> void *base, *begin, *end; > >>> - int ret; > >>> + int ret = 0; > >>> > >>> asm volatile("" ::: "memory"); /* in real code it should be smp_rmb() */ > >>> if (data_head == data_tail) > >> > >> This looks like a separate issue. The ret variable should really be > >> enum bpf_perf_event_ret, so could you please initialize it to one of the > >> values of this enum? > >> > >> The uninitilized condition can only happen if (data_head != data_tail) > >> but at the same time (data_head % size == data_tail % size) which > >> should never really happen... Perhaps initializing to > >> LIBBPF_PERF_EVENT_ERROR would make sense? > >> > >> Or better still adding: > >> > >> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > >> index f732237610e5..fa5a25945f19 100644 > >> --- a/tools/lib/bpf/libbpf.c > >> +++ b/tools/lib/bpf/libbpf.c > >> @@ -2289,6 +2289,8 @@ bpf_perf_event_read_simple(void *mem, unsigned long size, > >> > >> begin = base + data_tail % size; > >> end = base + data_head % size; > >> + if (being == end) > >> + return LIBBPF_PERF_EVENT_ERROR; > > > > Sounds good to me. > > > > If you want I can send you a separate patch for this. As far as I'm concerned - yes, please! ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" 2018-07-27 17:57 ` Jakub Kicinski @ 2018-07-27 18:29 ` Daniel Borkmann 0 siblings, 0 replies; 6+ messages in thread From: Daniel Borkmann @ 2018-07-27 18:29 UTC (permalink / raw) To: Jakub Kicinski, Thomas-Mich Richter Cc: ast, netdev, linux-kernel, heiko.carstens, brueckner, schwidefsky, wangnan0 On 07/27/2018 07:57 PM, Jakub Kicinski wrote: > On Fri, 27 Jul 2018 09:22:03 +0200, Thomas-Mich Richter wrote: >> On 07/27/2018 04:16 AM, Daniel Borkmann wrote: >>> On 07/26/2018 03:48 AM, Jakub Kicinski wrote: >>>> On Wed, 25 Jul 2018 09:21:26 +0200, Thomas Richter wrote: >>>>> commit a5b8bd47dcc57 ("bpf tools: Collect eBPF programs from their own sections") >>>> >>>> Hmm.. are you sure it's not 531b014e7a2f ("tools: bpf: make use of >>>> reallocarray") that caused the issue? That commit made us switch from >>>> XSI-compliant to GNU-specific strerror_r() implementation.. >>>> >>>> /me checks >>>> >>>> Yes it looks like 531b014e7a2f~ builds just fine. >>>> >>>> Daniel, did you try to apply v1 to the bpf tree? Perhaps there is a >>>> confusion about the trees here, if this is caused by my recent change >>>> it's a bpf-next material. strerror() works, but strerror_r() seems >>>> nicer, so perhaps we could keep it if the patch worked in bpf-next? >>> >>> Yeah indeed, the issue is only in bpf-next. When I compile libbpf from >>> bpf tree with the below flags then it's all good> >>> Agree that we should rather use strerror_r() given this is a library. >> >> Are you sure to stick with strerror_r? I ask because it is the only >> occurence of strerror_r in this file. All other error messages use strerror >> as in: >> pr_warning("failed to create map (name: '%s'): %s\n", >> map->name, >> strerror(errno)); >> >> $ fgrep strerror tools/lib/bpf/libbpf.c >> strerror(errno)); >> issue I try to solve---> strerror_r(-err, errmsg, sizeof(errmsg)); >> map->name, strerror(errno), errno); >> strerror(errno)); >> pr_warning("load bpf program failed: %s\n", strerror(errno)); >> pr_warning("failed to statfs %s: %s\n", dir, strerror(errno)); >> pr_warning("failed to pin program: %s\n", strerror(errno)); >> pr_warning("failed to mkdir %s: %s\n", path, strerror(-err)); >> pr_warning("failed to pin map: %s\n", strerror(errno)); >> $ >> >> The next issue with strerror_r is to assign the return value to a variable. >> Then we end up with variable set but not used: >> libbpf.c: In function ‘bpf_object__elf_collect’: >> libbpf.c:809:35: error: variable ‘cp’ set but not used [-Werror=unused-but-set-variable] >> char errmsg[STRERR_BUFSIZE], *cp; >> ^ >> cc1: all warnings being treated as errors > > The GNU-specific strerror_r() returns a pointer to a string containing > the error message. This may be either a pointer to a string that the > function stores in buf, or a pointer to some (immutable) static string > (in which case buf is unused). If the function stores a string in buf, > then at most buflen bytes are stored (the string may be truncated if > buflen is too small and errnum is unknown). The string always includes > a terminating null byte ('\0'). > > IOW you gotta use the return value. > >> Here is the source: >> if (err) { >> char errmsg[STRERR_BUFSIZE], *cp; >> >> cp = strerror_r(-err, errmsg, sizeof(errmsg)); >> pr_warning("failed to alloc program %s (%s): %s", >> name, obj->path, errmsg); >> } >> >> To fix this requires something like: >> pr_warning("failed to alloc program %s (%s): %s", >> name, obj->path, cp); > > This looks correct. > >> And after pr_warning() is done, the local array errmsg is deleted. >> >> A lot of overkill in my opinion, unless I miss something. > > IMO using potentially mutli-thread unsafe functions in a library is not > optimal, we should strive to convert the other instances of strerror() > rather than move the other way. Yeah, fully agree. We should convert the other ones as well over to use strerror_r(). Thanks, Daniel ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-07-27 19:21 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-07-25 7:21 [PATCH v2] perf build: Build error in libbpf with EXTRA_CFLAGS="-Wp,-D_FORTIFY_SOURCE=2 -O2" Thomas Richter 2018-07-26 1:48 ` Jakub Kicinski 2018-07-27 2:16 ` Daniel Borkmann 2018-07-27 7:22 ` Thomas-Mich Richter 2018-07-27 17:57 ` Jakub Kicinski 2018-07-27 18:29 ` Daniel Borkmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).