cgroup_walk_tree_begin() can end up with error and in some code paths '*handle' is not set and in some it is.
The functiomn should free all resources on error + return *handle = NULL Signed-off-by: Jan Safranek <jsafr...@redhat.com> --- src/api.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/api.c b/src/api.c index 2ed9e22..e0ed696 100644 --- a/src/api.c +++ b/src/api.c @@ -3078,8 +3078,6 @@ int cgroup_walk_tree_begin(const char *controller, const char *base_path, cgroup_dbg("path is %s\n", base_path); - cgroup_dbg("path is %s\n", base_path); - if (!cg_build_path(base_path, full_path, controller)) return ECGOTHER; @@ -3087,6 +3085,7 @@ int cgroup_walk_tree_begin(const char *controller, const char *base_path, if (!entry) { last_errno = errno; + *handle = NULL; return ECGOTHER; } @@ -3101,20 +3100,28 @@ int cgroup_walk_tree_begin(const char *controller, const char *base_path, if (entry->fts == NULL) { free(entry); last_errno = errno; + *handle = NULL; return ECGOTHER; } ent = fts_read(entry->fts); if (!ent) { cgroup_dbg("fts_read failed\n"); + fts_close(entry->fts); free(entry); + *handle = NULL; return ECGINVAL; } if (!*base_level && depth) *base_level = ent->fts_level + depth; ret = cg_walk_node(entry->fts, ent, *base_level, info, entry->flags); - - *handle = entry; + if (ret != 0) { + fts_close(entry->fts); + free(entry); + *handle = NULL; + } else { + *handle = entry; + } return ret; } ------------------------------------------------------------------------------ EMC VNX: the world's simplest storage, starting under $10K The only unified storage solution that offers unified management Up to 160% more powerful than alternatives and 25% more efficient. Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel