On Tue, 30 Jul 2019 18:04:53 +0000, Takshak Chahande wrote: > Jakub Kicinski <jakub.kicinski@xxxxxxxxxxxxx> wrote on Mon [2019-Jul-29 14:35:38 -0700]: > > @@ -158,20 +161,30 @@ static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type, > > static int do_show(int argc, char **argv) > > { > > enum bpf_attach_type type; > > + const char *path; > > int cgroup_fd; > > int ret = -1; > > > > - if (argc < 1) { > > - p_err("too few parameters for cgroup show"); > > - goto exit; > > - } else if (argc > 1) { > > - p_err("too many parameters for cgroup show"); > > - goto exit; > > + query_flags = 0; > > + > > + if (!REQ_ARGS(1)) > > + return -1; > > + path = GET_ARG(); > > + > > + while (argc) { > > + if (is_prefix(*argv, "effective")) { > > + query_flags |= BPF_F_QUERY_EFFECTIVE; > > + NEXT_ARG(); > > + } else { > > + p_err("expected no more arguments, 'effective', got: '%s'?", > > + *argv); > > + return -1; > > + } > > } > This while loop will allow multiple 'effective' keywords in the argument > unnecessarily. IMO, we should strictly restrict only for single > occurance of 'effective' word. It's kind of the way all bpftool works to date :( But perhaps not checking is worse than inconsistency? Okay, let's fix this up. > > - cgroup_fd = open(argv[0], O_RDONLY); > > + cgroup_fd = open(path, O_RDONLY); > > if (cgroup_fd < 0) { > > - p_err("can't open cgroup %s", argv[0]); > > + p_err("can't open cgroup %s", path); > > goto exit; > > } > > > > @@ -297,23 +310,29 @@ static int do_show_tree(int argc, char **argv) > > char *cgroup_root; > > int ret; > > > > - switch (argc) { > > - case 0: > > + query_flags = 0; > > + > > + if (!argc) { > > cgroup_root = find_cgroup_root(); > > if (!cgroup_root) { > > p_err("cgroup v2 isn't mounted"); > > return -1; > > } > > - break; > > - case 1: > > - cgroup_root = argv[0]; > > - break; > > - default: > > - p_err("too many parameters for cgroup tree"); > > - return -1; > > + } else { > > + cgroup_root = GET_ARG(); > > + > > + while (argc) { > > + if (is_prefix(*argv, "effective")) { > > + query_flags |= BPF_F_QUERY_EFFECTIVE; > > + NEXT_ARG(); > > NEXT_ARG() does update argc value; that means after this outer if/else we need > to know how argc has become 0 (through which path) before freeing up `cgroup_root` allocated > memory later at the end of this function. Good catch! > > + } else { > > + p_err("expected no more arguments, 'effective', got: '%s'?", > > + *argv); > > + return -1; > > + } > > + } > > } > Thanks for the patch. Apart from above two issues, patch looks good. Thanks for the review.