Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libbpf: Add pathname_concat() helper

Move snprintf and len check to common helper pathname_concat() to make the
code simpler.

Signed-off-by: Wang Yufen <wangyufen@huawei.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/1663828124-10437-1-git-send-email-wangyufen@huawei.com

authored by

Wang Yufen and committed by
Andrii Nakryiko
e588c116 e0401dce

+29 -47
+29 -47
tools/lib/bpf/libbpf.c
··· 2097 2097 return true; 2098 2098 } 2099 2099 2100 + static int pathname_concat(char *buf, size_t buf_sz, const char *path, const char *name) 2101 + { 2102 + int len; 2103 + 2104 + len = snprintf(buf, buf_sz, "%s/%s", path, name); 2105 + if (len < 0) 2106 + return -EINVAL; 2107 + if (len >= buf_sz) 2108 + return -ENAMETOOLONG; 2109 + 2110 + return 0; 2111 + } 2112 + 2100 2113 static int build_map_pin_path(struct bpf_map *map, const char *path) 2101 2114 { 2102 2115 char buf[PATH_MAX]; 2103 - int len; 2116 + int err; 2104 2117 2105 2118 if (!path) 2106 2119 path = "/sys/fs/bpf"; 2107 2120 2108 - len = snprintf(buf, PATH_MAX, "%s/%s", path, bpf_map__name(map)); 2109 - if (len < 0) 2110 - return -EINVAL; 2111 - else if (len >= PATH_MAX) 2112 - return -ENAMETOOLONG; 2121 + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); 2122 + if (err) 2123 + return err; 2113 2124 2114 2125 return bpf_map__set_pin_path(map, buf); 2115 2126 } ··· 7979 7968 continue; 7980 7969 7981 7970 if (path) { 7982 - int len; 7983 - 7984 - len = snprintf(buf, PATH_MAX, "%s/%s", path, 7985 - bpf_map__name(map)); 7986 - if (len < 0) { 7987 - err = -EINVAL; 7971 + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); 7972 + if (err) 7988 7973 goto err_unpin_maps; 7989 - } else if (len >= PATH_MAX) { 7990 - err = -ENAMETOOLONG; 7991 - goto err_unpin_maps; 7992 - } 7993 7974 sanitize_pin_path(buf); 7994 7975 pin_path = buf; 7995 7976 } else if (!map->pin_path) { ··· 8019 8016 char buf[PATH_MAX]; 8020 8017 8021 8018 if (path) { 8022 - int len; 8023 - 8024 - len = snprintf(buf, PATH_MAX, "%s/%s", path, 8025 - bpf_map__name(map)); 8026 - if (len < 0) 8027 - return libbpf_err(-EINVAL); 8028 - else if (len >= PATH_MAX) 8029 - return libbpf_err(-ENAMETOOLONG); 8019 + err = pathname_concat(buf, sizeof(buf), path, bpf_map__name(map)); 8020 + if (err) 8021 + return libbpf_err(err); 8030 8022 sanitize_pin_path(buf); 8031 8023 pin_path = buf; 8032 8024 } else if (!map->pin_path) { ··· 8039 8041 int bpf_object__pin_programs(struct bpf_object *obj, const char *path) 8040 8042 { 8041 8043 struct bpf_program *prog; 8044 + char buf[PATH_MAX]; 8042 8045 int err; 8043 8046 8044 8047 if (!obj) ··· 8051 8052 } 8052 8053 8053 8054 bpf_object__for_each_program(prog, obj) { 8054 - char buf[PATH_MAX]; 8055 - int len; 8056 - 8057 - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); 8058 - if (len < 0) { 8059 - err = -EINVAL; 8055 + err = pathname_concat(buf, sizeof(buf), path, prog->name); 8056 + if (err) 8060 8057 goto err_unpin_programs; 8061 - } else if (len >= PATH_MAX) { 8062 - err = -ENAMETOOLONG; 8063 - goto err_unpin_programs; 8064 - } 8065 8058 8066 8059 err = bpf_program__pin(prog, buf); 8067 8060 if (err) ··· 8064 8073 8065 8074 err_unpin_programs: 8066 8075 while ((prog = bpf_object__prev_program(obj, prog))) { 8067 - char buf[PATH_MAX]; 8068 - int len; 8069 - 8070 - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); 8071 - if (len < 0) 8072 - continue; 8073 - else if (len >= PATH_MAX) 8076 + if (pathname_concat(buf, sizeof(buf), path, prog->name)) 8074 8077 continue; 8075 8078 8076 8079 bpf_program__unpin(prog, buf); ··· 8083 8098 8084 8099 bpf_object__for_each_program(prog, obj) { 8085 8100 char buf[PATH_MAX]; 8086 - int len; 8087 8101 8088 - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); 8089 - if (len < 0) 8090 - return libbpf_err(-EINVAL); 8091 - else if (len >= PATH_MAX) 8092 - return libbpf_err(-ENAMETOOLONG); 8102 + err = pathname_concat(buf, sizeof(buf), path, prog->name); 8103 + if (err) 8104 + return libbpf_err(err); 8093 8105 8094 8106 err = bpf_program__unpin(prog, buf); 8095 8107 if (err)