From: Jan Alexander Steffens (heftig) Date: Wed, 11 Jan 2012 22:17:38 +0000 (+0100) Subject: depmod: Postpone creation of module array X-Git-Tag: v4~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00bd319113c1840a4f05d68c974e377ef36c9430;p=thirdparty%2Fkmod.git depmod: Postpone creation of module array Deleting modules (we have found replacements) invalidates the indices because the array collapses removed elements, hitting the assertion. Since we don't make use of the array until the sorting step, build it from the modules_by_name hash instead. --- diff --git a/tools/kmod-depmod.c b/tools/kmod-depmod.c index 0d12d5b3..b964963c 100644 --- a/tools/kmod-depmod.c +++ b/tools/kmod-depmod.c @@ -1141,16 +1141,9 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) else mod->relpath = NULL; - err = array_append(&depmod->modules, mod); - if (err < 0) { - free(mod); - return err; - } - err = hash_add_unique(depmod->modules_by_name, mod->modname, mod); if (err < 0) { ERR("hash_add_unique %s: %s\n", mod->modname, strerror(-err)); - array_pop(&depmod->modules); free(mod); return err; } @@ -1162,7 +1155,6 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) ERR("hash_add_unique %s: %s\n", mod->relpath, strerror(-err)); hash_del(depmod->modules_by_name, mod->modname); - array_pop(&depmod->modules); free(mod); return err; } @@ -1182,9 +1174,6 @@ static int depmod_module_del(struct depmod *depmod, struct mod *mod) hash_del(depmod->modules_by_name, mod->modname); - assert(depmod->modules.array[mod->idx] == mod); - array_remove_at(&depmod->modules, mod->idx); - mod_free(mod); return 0; } @@ -1428,6 +1417,22 @@ static int mod_cmp(const void *pa, const void *pb) { return a->sort_idx - b->sort_idx; } +static int depmod_modules_build_array(struct depmod *depmod) +{ + struct hash_iter module_iter; + const void *mod; + int err; + + hash_iter_init(depmod->modules_by_name, &module_iter); + while (hash_iter_next(&module_iter, NULL, &mod)) { + err = array_append(&depmod->modules, mod); + if (err < 0) + return err; + } + + return 0; +} + static void depmod_modules_sort(struct depmod *depmod) { char order_file[PATH_MAX], line[PATH_MAX]; @@ -2711,6 +2716,13 @@ static int do_depmod(int argc, char *argv[]) } } + err = depmod_modules_build_array(&depmod); + if (err < 0) { + CRIT("could not build module array: %s\n", + strerror(-err)); + goto cmdline_modules_failed; + } + depmod_modules_sort(&depmod); err = depmod_load(&depmod); if (err < 0)