On Sun, Sep 18, 2022 at 7:28 PM Wang Yufen <wangyufen@xxxxxxxxxx> wrote: > > Move snprintf and len check to common helper pathname_concat() to make the > code simpler. > > Signed-off-by: Wang Yufen <wangyufen@xxxxxxxxxx> > --- > tools/lib/bpf/libbpf.c | 76 +++++++++++++++++++------------------------------- > 1 file changed, 29 insertions(+), 47 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 3ad1392..43a530d 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -2096,19 +2096,30 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf, > return true; > } > > +static int pathname_concat(const char *path, const char *name, char *buf, size_t buflen) > +{ > + int len; > + > + len = snprintf(buf, buflen, "%s/%s", path, name); > + if (len < 0) > + return -EINVAL; > + if (len >= buflen) > + return -ENAMETOOLONG; > + > + return 0; > +} > + > static int build_map_pin_path(struct bpf_map *map, const char *path) > { > char buf[PATH_MAX]; > - int len; > + int err; > > if (!path) > path = "/sys/fs/bpf"; > > - len = snprintf(buf, PATH_MAX, "%s/%s", path, bpf_map__name(map)); > - if (len < 0) > - return -EINVAL; > - else if (len >= PATH_MAX) > - return -ENAMETOOLONG; > + err = pathname_concat(path, bpf_map__name(map), buf, PATH_MAX); sizeof(buf) instead of PATH_MAX? > + if (err) > + return err; > > return bpf_map__set_pin_path(map, buf); > } > @@ -7961,17 +7972,9 @@ int bpf_object__pin_maps(struct bpf_object *obj, const char *path) > continue; > > if (path) { > - int len; > - > - len = snprintf(buf, PATH_MAX, "%s/%s", path, > - bpf_map__name(map)); > - if (len < 0) { > - err = -EINVAL; > - goto err_unpin_maps; > - } else if (len >= PATH_MAX) { > - err = -ENAMETOOLONG; > + err = pathname_concat(path, bpf_map__name(map), buf, PATH_MAX); same, let's not hardcode constants we don't need to hardcode, just do sizeof(buf) > + if (err) > goto err_unpin_maps; > - } > sanitize_pin_path(buf); > pin_path = buf; > } else if (!map->pin_path) { > @@ -8009,14 +8012,9 @@ int bpf_object__unpin_maps(struct bpf_object *obj, const char *path) > char buf[PATH_MAX]; > > if (path) { > - int len; > - > - len = snprintf(buf, PATH_MAX, "%s/%s", path, > - bpf_map__name(map)); > - if (len < 0) > - return libbpf_err(-EINVAL); > - else if (len >= PATH_MAX) > - return libbpf_err(-ENAMETOOLONG); > + err = pathname_concat(path, bpf_map__name(map), buf, PATH_MAX); ditto here and all the cases below > + if (err) > + return err; > sanitize_pin_path(buf); > pin_path = buf; > } else if (!map->pin_path) { > @@ -8034,6 +8032,7 @@ int bpf_object__unpin_maps(struct bpf_object *obj, const char *path) > int bpf_object__pin_programs(struct bpf_object *obj, const char *path) > { > struct bpf_program *prog; > + char buf[PATH_MAX]; > int err; > > if (!obj) > @@ -8045,17 +8044,9 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path) > } > > bpf_object__for_each_program(prog, obj) { > - char buf[PATH_MAX]; > - int len; > - > - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); > - if (len < 0) { > - err = -EINVAL; > - goto err_unpin_programs; > - } else if (len >= PATH_MAX) { > - err = -ENAMETOOLONG; > + err = pathname_concat(path, prog->name, buf, PATH_MAX); > + if (err) > goto err_unpin_programs; > - } > > err = bpf_program__pin(prog, buf); > if (err) > @@ -8066,13 +8057,7 @@ int bpf_object__pin_programs(struct bpf_object *obj, const char *path) > > err_unpin_programs: > while ((prog = bpf_object__prev_program(obj, prog))) { > - char buf[PATH_MAX]; > - int len; > - > - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); > - if (len < 0) > - continue; > - else if (len >= PATH_MAX) > + if (pathname_concat(path, prog->name, buf, PATH_MAX)) > continue; > > bpf_program__unpin(prog, buf); > @@ -8091,13 +8076,10 @@ int bpf_object__unpin_programs(struct bpf_object *obj, const char *path) > > bpf_object__for_each_program(prog, obj) { > char buf[PATH_MAX]; > - int len; > > - len = snprintf(buf, PATH_MAX, "%s/%s", path, prog->name); > - if (len < 0) > - return libbpf_err(-EINVAL); > - else if (len >= PATH_MAX) > - return libbpf_err(-ENAMETOOLONG); > + err = pathname_concat(path, prog->name, buf, PATH_MAX); > + if (err) > + return libbpf_err(err); > > err = bpf_program__unpin(prog, buf); > if (err) > -- > 1.8.3.1 >