bug-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

rootnoverify from different drive bug patch


From: adrian15
Subject: rootnoverify from different drive bug patch
Date: Mon, 19 Mar 2007 10:16:53 +0100
User-agent: Thunderbird 1.5.0.9 (X11/20070102)

Attached there is a patch that addresses the following bug:

Let's suppose you install a grub in the partition boot sector from (hd0,5).

Let's suppose that you boot from a grub cdrom and that you want to chainload it and you do:

rootnoverify (hd0,5)
chainloader +1
boot

This gives you a: Error 25.

If you try:
root (hd0,5)
chainloader +1
boot

it boots... but this is not ok for you because you know you should chainload a partition boot sector installed grub with rootnoverify.

The problem is in the real_root_func function on builtins.c that when it does not have to mount it uses:

      if (open_partition ())
        {
          set_bootdev (0);
          if (errnum)
            return 1;
        }

and this set_bootdev uses the saved_drive variable to make this saved_drive the bootable one. Why? Because later in the code... when the drive is mounted the variable where the mounted drive is called: saved_drive :)

However in this part of the code the opened partition (thanks to open_partition) it is stored on the current_drive variable.


Putting the code like this:

      if (open_partition ())
        {
          saved_drive = current_drive;
          set_bootdev (0);
          if (errnum)
            return 1;
        }


fixes the problem.


Now I have some problems when you boot from a grub usb hard disk but from cdrom it works without any problem, and it is evident that there's a bug there. The set_bootdev function waits for the saved_drive to be set and when you run the old rootnoverify code is never set!

adrian15
--- sgd_source_code_0.9586/dev_grub/stage2/builtins.c   2007-03-11 
21:45:54.000000000 +0100
+++ sgd_source_code_0.9588/dev_grub/stage2/builtins.c   2007-03-17 
23:58:11.000000000 +0100
@@ -3520,6 +3520,7 @@
         must be set appropriately.  */
       if (open_partition ())
        {
+         saved_drive = current_drive; // Let's update saved_drive with value 
from open_partition - adrian15
          set_bootdev (0);
          if (errnum)
            return 1;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]