On Fri, 2 Jul 2021 14:10:46 +0300 "Yordan Karadzhov (VMware)" <y.karadz@xxxxxxxxx> wrote: > > +static int build_list(const char *name, void *data) > > +{ > > + struct instance_list *list = data; > > + char **instances; > > + int ret = -1; > > + > > + if (!match(name, list->re)) > > + return 0; > > + > > + instances = realloc(list->list, list->size + 2); > > + if (!instances) > > + goto out; > > + > > + list->list = instances; > Hi Steven, > > I am not sure what was your original intention here, but this doesn't > seem to work properly. Maybe we need something like this: > > int size = sizeof(*instances) * (list->size + 2); > instances = realloc(list->list, size); Bah, that's what I get for trying to "multitask" while coding :-p That was suppose to be: instances = realloc(list->list, sizeof(*instances) * (list->size + 2); as you stated, but I'll keep it one line. > if (!instances) > goto out; > > instances[list->size + 1] = NULL; > > > > > > + list->list[list->size] = strdup(name); > > + if (!list->list[list->size]) > > + goto out; > > + > > + list->size++; > > + ret = 0; > > + > > + out: > > + list->failed = ret; > > + return ret; > > +} > > + > > +/** > > + * tracefs_instances - return a list of instance names > > + * @regex: A regex of instances to filter on (NULL to match all) > > + * > > + * Returns a list of names of existing instances, that must be > > + * freed with tracefs_list_free(). Note, if there are no matches > > + * then an empty list will be returned (not NULL). > > + * NULL on error. > > + */ > > +char **tracefs_instances(const char *regex) > > +{ > > + struct instance_list list = { .re = NULL, .list = NULL }; > > + regex_t re; > > + int ret; > > + > > + if (regex) { > > + ret = regcomp(&re, regex, REG_ICASE|REG_NOSUB); > > + if (ret < 0) > > + return NULL; > > + list.re = &re; > > + } > > + > > + ret = tracefs_instances_walk(build_list, &list); > > + if (ret < 0 || list.failed) { > > + tracefs_list_free(list.list); > > + list.list = NULL; > > + } else { > > + if (!list.list) { > > + /* No matches should produce an empty list */ > > + list.list = malloc(sizeof(*list.list)); > > + if (list.list) > > + list.list[0] = NULL; > > + } > > Or you can just do: > return calloc(1, sizeof(*list.list)); Which I do in tracefs_get_probes(), must have missed this one. Will update, thanks for the review. -- Steve > > Thanks! > Yordan > > > + } > > + return list.list; > > +}