From be728dd34718a072c7f196cef6539d35f632c7a9 Mon Sep 17 00:00:00 2001 From: Tobias Stoeckmann Date: Thu, 24 Oct 2024 20:54:40 +0200 Subject: [PATCH] libkmod: Simplify module dependency parsing The return value of kmod_module_parse_depline and module_get_dependencies_noref are never used, and the same is true for n_dep in struct kmod_module. Remove them and turn variable n in kmod_module_parse_depline into a size_t to make sure that it never overflows. Signed-off-by: Tobias Stoeckmann Reviewed-by: Emil Velikov Link: https://github.com/kmod-project/kmod/pull/211 Signed-off-by: Lucas De Marchi --- libkmod/libkmod-internal.h | 2 +- libkmod/libkmod-module.c | 39 +++++++++++++++----------------------- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index fa0892f4..4ecdfb1f 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -122,7 +122,7 @@ _nonnull_all_ const char * const *kmod_weakdep_get_weak(const struct kmod_list * /* libkmod-module.c */ int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias, const char *name, struct kmod_module **mod); -_nonnull_all_ int kmod_module_parse_depline(struct kmod_module *mod, char *line); +_nonnull_all_ void kmod_module_parse_depline(struct kmod_module *mod, char *line); _nonnull_(1) void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd); _nonnull_(1) void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd); _nonnull_(1)void kmod_module_set_visited(struct kmod_module *mod, bool visited); diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 95a2073b..28ddee4e 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -44,7 +44,6 @@ struct kmod_module { const char *remove_commands; /* owned by kmod_config */ char *alias; /* only set if this module was created from an alias */ struct kmod_file *file; - int n_dep; int refcount; struct { bool dep : 1; @@ -105,30 +104,30 @@ static inline bool module_is_inkernel(struct kmod_module *mod) return false; } -int kmod_module_parse_depline(struct kmod_module *mod, char *line) +void kmod_module_parse_depline(struct kmod_module *mod, char *line) { struct kmod_ctx *ctx = mod->ctx; struct kmod_list *list = NULL; const char *dirname; char buf[PATH_MAX]; char *p, *saveptr; - int err = 0, n = 0; + size_t n = 0; size_t dirnamelen; if (mod->init.dep) - return mod->n_dep; + return; assert(mod->dep == NULL); mod->init.dep = true; p = strchr(line, ':'); if (p == NULL) - return 0; + return; *p = '\0'; dirname = kmod_get_dirname(mod->ctx); dirnamelen = strlen(dirname); if (dirnamelen + 2 >= PATH_MAX) - return 0; + return; memcpy(buf, dirname, dirnamelen); buf[dirnamelen] = '/'; @@ -138,10 +137,10 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) if (mod->path == NULL) { const char *str = path_join(line, dirnamelen, buf); if (str == NULL) - return 0; + return; mod->path = strdup(str); if (mod->path == NULL) - return 0; + return; } p++; @@ -149,6 +148,7 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) p = strtok_r(NULL, " \t", &saveptr)) { struct kmod_module *depmod = NULL; const char *path; + int err; path = path_join(p, dirnamelen, buf); if (path == NULL) { @@ -165,19 +165,16 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) DBG(ctx, "add dep: %s\n", path); list = kmod_list_prepend(list, depmod); - n++; } - DBG(ctx, "%d dependencies for %s\n", n, mod->name); + DBG(ctx, "%zu dependencies for %s\n", n, mod->name); mod->dep = list; - mod->n_dep = n; - return n; + return; fail: kmod_module_unref_list(list); mod->init.dep = false; - return err; } void kmod_module_set_visited(struct kmod_module *mod, bool visited) @@ -509,23 +506,17 @@ KMOD_EXPORT int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, return kmod_module_apply_filter(ctx, KMOD_FILTER_BLACKLIST, input, output); } -static const struct kmod_list *module_get_dependencies_noref(const struct kmod_module *mod) +static void module_get_dependencies_noref(const struct kmod_module *mod) { if (!mod->init.dep) { /* lazy init */ char *line = kmod_search_moddep(mod->ctx, mod->name); - if (line == NULL) - return NULL; - - kmod_module_parse_depline((struct kmod_module *)mod, line); - free(line); - - if (!mod->init.dep) - return NULL; + if (line != NULL) { + kmod_module_parse_depline((struct kmod_module *)mod, line); + free(line); + } } - - return mod->dep; } KMOD_EXPORT struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod) -- 2.47.2