From 8a3967479630f62036288f84391d73996f1639ce Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 18 Oct 2018 09:44:08 +0200 Subject: bootchooser: put bootchooser after creating a boot entry Between creating a boot entry for bootchooser and actually using it the underlying state may have been modified, so make sure to get a current bootchooser when booting it, thus do a bootchooser_put after having created the entry and a bootchooser_get again when booting it. Signed-off-by: Sascha Hauer --- common/bootchooser.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) (limited to 'common/bootchooser.c') diff --git a/common/bootchooser.c b/common/bootchooser.c index 83b15e0f78..29f61aec7f 100644 --- a/common/bootchooser.c +++ b/common/bootchooser.c @@ -52,7 +52,6 @@ static int retry; static int last_boot_successful; struct bootchooser { - struct bootentry entry; struct list_head targets; struct bootchooser_target *last_chosen; @@ -841,20 +840,26 @@ int bootchooser_boot(struct bootchooser *bc) static int bootchooser_entry_boot(struct bootentry *entry, int verbose, int dryrun) { - struct bootchooser *bc = container_of(entry, struct bootchooser, - entry); + struct bootchooser *bc; + int ret; + + bc = bootchooser_get(); + if (IS_ERR(bc)) + return PTR_ERR(bc); + bc->verbose = verbose; bc->dryrun = dryrun; - return bootchooser_boot(bc); + ret = bootchooser_boot(bc); + + bootchooser_put(bc); + + return ret; } static void bootchooser_release(struct bootentry *entry) { - struct bootchooser *bc = container_of(entry, struct bootchooser, - entry); - - bootchooser_put(bc); + free(entry); } /** @@ -869,6 +874,7 @@ static void bootchooser_release(struct bootentry *entry) static int bootchooser_add_entry(struct bootentries *entries, const char *name) { struct bootchooser *bc; + struct bootentry *entry; if (strcmp(name, "bootchooser")) return 0; @@ -877,12 +883,16 @@ static int bootchooser_add_entry(struct bootentries *entries, const char *name) if (IS_ERR(bc)) return PTR_ERR(bc); - bc->entry.boot = bootchooser_entry_boot; - bc->entry.release = bootchooser_release; - bc->entry.title = xstrdup("bootchooser"); - bc->entry.description = xstrdup("bootchooser"); + entry = xzalloc(sizeof(*entry)); + + entry->boot = bootchooser_entry_boot; + entry->release = bootchooser_release; + entry->title = xstrdup("bootchooser"); + entry->description = xstrdup("bootchooser"); - bootentries_add_entry(entries, &bc->entry); + bootentries_add_entry(entries, entry); + + bootchooser_put(bc); return 1; } -- cgit v1.2.3