]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
bpf: fix build error in libbpf with EXTRA_CFLAGS="-Wp, -D_FORTIFY_SOURCE=2 -O2"
authorThomas Richter <tmricht@linux.ibm.com>
Mon, 30 Jul 2018 08:53:23 +0000 (10:53 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 31 Jul 2018 00:08:55 +0000 (02:08 +0200)
Commit 531b014e7a2f ("tools: bpf: make use of reallocarray") causes
a compiler error when building the perf tool in the linux-next tree.
Compile file tools/lib/bpf/libbpf.c on a FEDORA 28 installation with
gcc compiler version: gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20)
shows this 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

Replace all occurrences of strerror() by calls to strerror_r(). To
keep the compiler quiet also use the return value from strerror_r()
otherwise a 'variable set but not use' warning which is treated as
error terminates the compile.

Fixes: 531b014e7a2f ("tools: bpf: make use of reallocarray")
Suggested-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Suggested-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.ibm.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
tools/lib/bpf/libbpf.c

index 857d3d16968ebc6687c536b873f275f97c6fddb9..79fc7ed6995ab944c14c10ca135cd7ff39a16466 100644 (file)
@@ -467,8 +467,10 @@ static int bpf_object__elf_init(struct bpf_object *obj)
        } else {
                obj->efile.fd = open(obj->path, O_RDONLY);
                if (obj->efile.fd < 0) {
-                       pr_warning("failed to open %s: %s\n", obj->path,
-                                       strerror(errno));
+                       char errmsg[STRERR_BUFSIZE];
+                       char *cp = strerror_r(errno, errmsg, sizeof(errmsg));
+
+                       pr_warning("failed to open %s: %s\n", obj->path, cp);
                        return -errno;
                }
 
@@ -807,10 +809,11 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
                                                      data->d_size, name, idx);
                        if (err) {
                                char errmsg[STRERR_BUFSIZE];
+                               char *cp = strerror_r(-err, errmsg,
+                                                     sizeof(errmsg));
 
-                               strerror_r(-err, errmsg, sizeof(errmsg));
                                pr_warning("failed to alloc program %s (%s): %s",
-                                          name, obj->path, errmsg);
+                                          name, obj->path, cp);
                        }
                } else if (sh.sh_type == SHT_REL) {
                        void *reloc = obj->efile.reloc;
@@ -1104,6 +1107,7 @@ bpf_object__create_maps(struct bpf_object *obj)
        for (i = 0; i < obj->nr_maps; i++) {
                struct bpf_map *map = &obj->maps[i];
                struct bpf_map_def *def = &map->def;
+               char *cp, errmsg[STRERR_BUFSIZE];
                int *pfd = &map->fd;
 
                if (map->fd >= 0) {
@@ -1131,8 +1135,9 @@ bpf_object__create_maps(struct bpf_object *obj)
 
                *pfd = bpf_create_map_xattr(&create_attr);
                if (*pfd < 0 && create_attr.btf_key_type_id) {
+                       cp = strerror_r(errno, errmsg, sizeof(errmsg));
                        pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
-                                  map->name, strerror(errno), errno);
+                                  map->name, cp, errno);
                        create_attr.btf_fd = 0;
                        create_attr.btf_key_type_id = 0;
                        create_attr.btf_value_type_id = 0;
@@ -1145,9 +1150,9 @@ bpf_object__create_maps(struct bpf_object *obj)
                        size_t j;
 
                        err = *pfd;
+                       cp = strerror_r(errno, errmsg, sizeof(errmsg));
                        pr_warning("failed to create map (name: '%s'): %s\n",
-                                  map->name,
-                                  strerror(errno));
+                                  map->name, cp);
                        for (j = 0; j < i; j++)
                                zclose(obj->maps[j].fd);
                        return err;
@@ -1299,6 +1304,7 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type,
             char *license, u32 kern_version, int *pfd, int prog_ifindex)
 {
        struct bpf_load_program_attr load_attr;
+       char *cp, errmsg[STRERR_BUFSIZE];
        char *log_buf;
        int ret;
 
@@ -1328,7 +1334,8 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type,
        }
 
        ret = -LIBBPF_ERRNO__LOAD;
-       pr_warning("load bpf program failed: %s\n", strerror(errno));
+       cp = strerror_r(errno, errmsg, sizeof(errmsg));
+       pr_warning("load bpf program failed: %s\n", cp);
 
        if (log_buf && log_buf[0] != '\0') {
                ret = -LIBBPF_ERRNO__VERIFY;
@@ -1627,6 +1634,7 @@ int bpf_object__load(struct bpf_object *obj)
 
 static int check_path(const char *path)
 {
+       char *cp, errmsg[STRERR_BUFSIZE];
        struct statfs st_fs;
        char *dname, *dir;
        int err = 0;
@@ -1640,7 +1648,8 @@ static int check_path(const char *path)
 
        dir = dirname(dname);
        if (statfs(dir, &st_fs)) {
-               pr_warning("failed to statfs %s: %s\n", dir, strerror(errno));
+               cp = strerror_r(errno, errmsg, sizeof(errmsg));
+               pr_warning("failed to statfs %s: %s\n", dir, cp);
                err = -errno;
        }
        free(dname);
@@ -1656,6 +1665,7 @@ static int check_path(const char *path)
 int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
                              int instance)
 {
+       char *cp, errmsg[STRERR_BUFSIZE];
        int err;
 
        err = check_path(path);
@@ -1674,7 +1684,8 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
        }
 
        if (bpf_obj_pin(prog->instances.fds[instance], path)) {
-               pr_warning("failed to pin program: %s\n", strerror(errno));
+               cp = strerror_r(errno, errmsg, sizeof(errmsg));
+               pr_warning("failed to pin program: %s\n", cp);
                return -errno;
        }
        pr_debug("pinned program '%s'\n", path);
@@ -1684,13 +1695,16 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path,
 
 static int make_dir(const char *path)
 {
+       char *cp, errmsg[STRERR_BUFSIZE];
        int err = 0;
 
        if (mkdir(path, 0700) && errno != EEXIST)
                err = -errno;
 
-       if (err)
-               pr_warning("failed to mkdir %s: %s\n", path, strerror(-err));
+       if (err) {
+               cp = strerror_r(-err, errmsg, sizeof(errmsg));
+               pr_warning("failed to mkdir %s: %s\n", path, cp);
+       }
        return err;
 }
 
@@ -1737,6 +1751,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)
 
 int bpf_map__pin(struct bpf_map *map, const char *path)
 {
+       char *cp, errmsg[STRERR_BUFSIZE];
        int err;
 
        err = check_path(path);
@@ -1749,7 +1764,8 @@ int bpf_map__pin(struct bpf_map *map, const char *path)
        }
 
        if (bpf_obj_pin(map->fd, path)) {
-               pr_warning("failed to pin map: %s\n", strerror(errno));
+               cp = strerror_r(errno, errmsg, sizeof(errmsg));
+               pr_warning("failed to pin map: %s\n", cp);
                return -errno;
        }