mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	bpf: fix build error in libbpf with EXTRA_CFLAGS="-Wp, -D_FORTIFY_SOURCE=2 -O2"
Commit531b014e7a("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:531b014e7a("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>
This commit is contained in:
		
							parent
							
								
									2e96187b69
								
							
						
					
					
						commit
						1ce6a9fc15
					
				
					 1 changed files with 29 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue