Correction de qi-bootmenu 2.0

  |   Source

Suite à la sortie de la version 2.0 de qi-bootmenu, je me suis empressé de l'installer. Malheureusement, cette version est boguée : elle affiche toutes les alternatives de boot possible, mais quelque soit l'entrée choisie, seule la dernière entrée est bootée.

En investiguant, il s'avère que le problème fût assez simple corriger. Néanmoins, Marc André Tanner n'est pas prompt à publier une nouvelle version. Du coup, je publie ma propre version.

Mon patch :

From: Guilhem Bonnefille <guilhem .bonnefille@gmail.com>
Subject: [PATCH] Fix activation of selected entry

When selecting an entry, the booted partition is always the latest  
one.

It seems the bug is around the creation of MenuEntry. Currently  
all entries are constructed with an automatic variable. Doing this,  
data are corrupted when user selects an entry on the GUI.

This patch solves the problem by cloning the MenuEntry data  
(dynamically allocateed variable) just before creating the graphical  
entry. The matter is just sort of memory leak as no code free the  
cloned memory. But is it really an important issue?

Signed-off-by: Guilhem Bonnefille <guilhem .bonnefille@gmail.com>

---  
 gui-list.c |    4 +++-  
 kexec.c    |    3 +++  
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/gui-list.c b/gui-list.c  
index 03c1949..80aa2b6 100644  
--- a/gui-list.c  
+++ b/gui-list.c

@@ -72,6 +72,8 @@ static void gui_list_show_error(const char *errstr, va_list ap) {

 static void gui_list_add_item(MenuItem *item) {  
        static unsigned int y;  
-       gui_list_draw_item(item->text, item->logo, gui_item_clicked, item, 0, y);  
+       MenuItem *clone = malloc(sizeof(MenuItem));  
+       memcpy(clone, item, sizeof(MenuItem));  
+       gui_list_draw_item(item->text, item->logo, gui_item_clicked, clone, 0, y);  
        y += LIST_LOGO_HEIGHT;  
 }  
diff --git a/kexec.c b/kexec.c  
index 977c67b..a3d6931 100644  
--- a/kexec.c  
+++ b/kexec.c  
@@ -375,6 +375,9 @@ static bool boot_kernel(BootItem *i) {  
        }

        const char *kexec_load[] = { KEXEC, get_kernel_cmdline(i), "-l", i->kernel, NULL };  
+       /* debug */  
+       puts("Setting following kernel options via kexec:");  
+       puts(kexec_load[1]);  
        if (fexecw(kexec_load[0], (char *const *)kexec_load, NULL)) {  
                gui_show_error("Couldn't load kernel from '%s'", i->kernel);  
                return false;  
--   
tg: (94fc251..) t/fix/duplicate-menuentry (depends on: master)