diff options
-rw-r--r-- | src/udev/udev-builtin-kmod.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/udev/udev-builtin-kmod.c b/src/udev/udev-builtin-kmod.c index a9704c101c..a8792e097f 100644 --- a/src/udev/udev-builtin-kmod.c +++ b/src/udev/udev-builtin-kmod.c @@ -38,10 +38,10 @@ static struct kmod_ctx *ctx; static int load_module(struct udev *udev, const char *alias) { + int err; #ifdef HAVE_LIBKMOD struct kmod_list *list = NULL; struct kmod_list *l; - int err; err = kmod_module_new_from_lookup(ctx, alias, &list); if (err < 0) @@ -65,11 +65,25 @@ static int load_module(struct udev *udev, const char *alias) } kmod_module_unref_list(list); - return err; #else - char *const argv[] = { MODPROBE, "-bq", alias, 0 }; - return execute_command(MODPROBE, argv); + + /* + These 3 temporaries are needed because argv (below) is a const pointer, not pointer to const + */ + char *tmp_alias = strdup(alias); + char *tmp_modprobe = strdup(MODPROBE); + char *tmp_bq = strdup("-bq"); + char *const argv[] = { tmp_modprobe, tmp_bq, tmp_alias, 0 }; + + err = execute_command(MODPROBE, argv); + + free(tmp_alias); + free(tmp_modprobe); + free(tmp_bq); #endif + /* both 'kmod_module_new_from_lookup' and 'execute_command' return <0 on error + so it is ok to assign both to 'err' */ + return err; } _printf_(6,0) |