grubby: --bootloader-probe option is broken for grub legacy installs

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

 



Hi folks,

I've noticed that on my 64 bit F16 development laptop, executing

grubby --bootloader-probe

shows grubby is unable to detect my grub legacy installation (this system was upgraded from F15 -> F16). Then Cleber pointed me out that in the manpage for grubby:

       --bootloader-probe
grubby tries to determine if grub or lilo is currently installed. When one of those bootloaders is found the name of that bootloader is displayed on stdout. Both could be installed (on different devices), and grubby will print out the names of both bootloaders, one per line. The probe for grub requires a commented out boot directive grub.conf identical to the standard directive in the lilo configuration file. If this is not present grubby will assume grub is not installed (note that anaconda places this directive in grub.conf files it creates). This
              option is only available on ia32 platforms.

First reaction is "what the...". Ok, then it should work fine on an older 32 bit F14 laptop right? Well, turns our it's not working as well.

I do understand that this is a minor bug, and it does not affect grubby's ability to install new kernels, but yet it is a bug and should be fixed. Also, as someone not aware of the situation, can someone explain why on earth this detection shouldn't work on x86_64 machines?

I've started to look at it on gdb and found out that the place where things go awry is around line 2462, function checkDeviceBootloader:

    /* first three bytes should match, a jmp short should be in there */
    if (memcmp(boot, bootSect, 3))

memcp will return > 0 and then checkDeviceBootloader will return 0, which will make grubby to return 0, but not print 'grub'.

Breakpoint 1, checkDeviceBootloader (device=0x6106d0 "/dev/sda", boot=0x7fffffffd6c0 "\353H\220") at grubby.c:2463
2463	    if (memcmp(boot, bootSect, 3))
(gdb) p boot
$1 = (const unsigned char *) 0x7fffffffd6c0 "\353H\220"
(gdb) p bootSect
$2 =
    "\353H\220", 'w' <repeats 59 times>,

The only way I can get this memcp to pass is to read only the first byte of both strings. But then the function would still fail here:

    if (boot[1] == 0xeb) {
	offset = boot[2] + 2;
    } else if (boot[1] == 0xe8 || boot[1] == 0xe9) {
	offset = (boot[3] << 8) + boot[2] + 2;
    } else if (boot[0] == 0xeb) {
	offset = boot[1] + 2;
    } else if (boot[0] == 0xe8 || boot[0] == 0xe9) {
	offset = (boot[2] << 8) + boot[1] + 2;
    } else {
	return 0;
    }

    if (memcmp(boot + offset, bootSect + offset, CODE_SEG_SIZE))
	return 0;

So, I thought I'd ask to someone who might have a clue of what's actually happening here. Since the code is failing on a 32 bit intel machine, I smell a real bug on the heuristics being used to detect the boot loader. Hope someone kind enough could explain what is the idea behind the code detection.

Thanks for your time, and hoping to help fix this bug,

Lucas

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux