Bug#491140: grub: fails with divide error when installing on an image file on amd64
Kalle A. Sandstr"om
ksandstr at iki.fi
Thu Jul 17 03:20:46 UTC 2008
Package: grub
Version: 0.97-41
Severity: normal
Grub seems to fail if attempting to install the boot block on an image file
target. This only occurs when running a Debian patched version of grub on an
amd64 host; unpatched grub does not produce this error and neither does the
patched grub on an x86 host. The patched x86 version also fails if run in a
32-bit chroot on an amd64 host.
An error message is left in the kernel dmesg:
ioctl32(grub:3018): Unknown cmd fd(3) cmd(00005331){t:'S';sz:0} arg(00000000) on /home/ksandstr/grub_image_bug/demonstration.img
ioctl32(grub:3018): Unknown cmd fd(3) cmd(80041272){t:12;sz:4} arg(f7ba49f0) on /home/ksandstr/grub_image_bug/demonstration.img
ioctl32(grub:3018): Unknown cmd fd(3) cmd(00001261){t:12;sz:0} arg(00000000) on /home/ksandstr/grub_image_bug/demonstration.img
ioctl32(grub:3018): Unknown cmd fd(3) cmd(00001261){t:12;sz:0} arg(00000000) on /home/ksandstr/grub_image_bug/demonstration.img
grub[3018] trap divide error ip:804d886 sp:f7ba4720 error:0 in grub[8048000+bb000]
I suspect this is caused by lacking error handling in an ioctl that is present
in x86 kernels but absent in amd64 kernels: the ioctl command would return an
EINVAL error (or equivalent) error which the caller ignores, causing an output
variable to be left at its initialization-time value of 0, which produces a
division by zero error further down the line.
A script that provokes this bug (requires the genext2fs package):
-- provoke.sh begins --
#!/bin/sh
IMAGE=demonstration.img
mkdir -p rootdir
genext2fs --squash -b 2880 -d rootdir $IMAGE
/usr/sbin/grub --batch --device-map=/dev/null <<EOF
device (fd0) $IMAGE
root (fd0)
setup (fd0)
quit
EOF
-- provoke.sh ends --
-- Package-specific info:
*********************** BEGIN /boot/grub/device.map
(hd0) /dev/hda
(hd1) /dev/hdb
(hd2) /dev/sda
(hd3) /dev/sdb
*********************** END /boot/grub/device.map
*********************** BEGIN /proc/mounts
/dev/md0 / reiserfs rw,relatime,acl 0 0
/dev/md0 /dev/.static/dev reiserfs rw,acl 0 0
/dev/hda1 /boot ext2 rw,noatime,errors=continue 0 0
/dev/mapper/uc /usr jfs rw,relatime 0 0
/dev/mapper/vc /var jfs rw,relatime 0 0
/dev/mapper/raid1-emul /emul jfs rw,relatime 0 0
/dev/mapper/raid1-srv /srv xfs rw,relatime,nobarrier,noquota 0 0
/dev/mapper/raid1-pg /var/lib/postgresql jfs rw,relatime 0 0
/dev/mapper/raid1-ia32sid /var/chroot/sid-ia32 jfs rw,relatime 0 0
/dev/mapper/home /home xfs rw,nobarrier,noquota 0 0
/dev/mapper/data /data xfs rw,nobarrier,noquota 0 0
/dev/mapper/bakkis /mnt/backup ext3 rw,errors=continue,data=ordered 0 0
/dev/mapper/stuff /stuff xfs rw,noatime,nobarrier,noquota 0 0
*********************** END /proc/mounts
*********************** BEGIN /boot/grub/menu.lst
# menu.lst - See: grub(8), info grub, update-grub(8)
# grub-install(8), grub-floppy(8),
# grub-md5-crypt, /usr/share/doc/grub
# and /usr/share/doc/grub-doc/.
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
default 0
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 5
# Pretty colours
color cyan/blue white/blue
### PASSWORD LINE REMOVED ###
# If used in the first section of a menu file, disable all interactive editing
# control (menu entry editor and command-line) and entries protected by the
# command 'lock'
### PASSWORD LINE REMOVED ###
### PASSWORD LINE REMOVED ###
### PASSWORD LINE REMOVED ###
#
# examples
#
# title Windows 95/98/NT/2000
# root (hd0,0)
# makeactive
# chainloader +1
#
# title Linux
# root (hd0,1)
# kernel /vmlinuz root=/dev/hda2 ro
#
#
# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST
### BEGIN AUTOMAGIC KERNELS LIST
## lines between the AUTOMAGIC KERNELS LIST markers will be modified
## by the debian update-grub script except for the default options below
## DO NOT UNCOMMENT THEM, Just edit them to your needs
## ## Start Default Options ##
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
## kopt_2_6_8=root=/dev/hdc1 ro
## kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=/dev/md0 ro console=tty0
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,0)
## should update-grub create alternative automagic boot options
## e.g. alternative=true
## alternative=false
# alternative=true
## should update-grub lock alternative automagic boot options
## e.g. lockalternative=true
## lockalternative=false
# lockalternative=false
## additional options to use with the default boot option, but not with the
## alternatives
## e.g. defoptions=vga=791 resume=/dev/hda5
# defoptions=
## should update-grub lock old automagic boot options
## e.g. lockold=false
## lockold=true
# lockold=false
## Xen hypervisor options to use with the default Xen boot option
# xenhopt=
## Xen Linux kernel options to use with the default Xen boot option
# xenkopt=console=tty0
## altoption boot targets option
## multiple altoptions lines are allowed
## e.g. altoptions=(extra menu suffix) extra boot options
## altoptions=(single-user) single
# altoptions=(recovery mode) single
## controls how many kernels should be put into the menu.lst
## only counts the first occurence of a kernel, not the
## alternative kernel options
## e.g. howmany=all
## howmany=7
# howmany=all
## should update-grub create memtest86 boot option
## e.g. memtest86=true
## memtest86=false
# memtest86=true
## should update-grub adjust the value of the default booted system
## can be true or false
# updatedefaultentry=false
## should update-grub add savedefault to the default options
## can be true or false
# savedefault=false
## ## End Default Options ##
title Debian GNU/Linux, kernel 2.6.25.6 Default
root (hd0,0)
kernel /vmlinuz root=/dev/md0 ro console=tty0
initrd /initrd.img
title Debian GNU/Linux, kernel 2.6.25.6 Default (recovery mode)
root (hd0,0)
kernel /vmlinuz root=/dev/md0 ro console=tty0 single
initrd /initrd.img
title Debian GNU/Linux, kernel 2.6.25.2 Previous
root (hd0,0)
kernel /vmlinuz.old root=/dev/md0 ro console=tty0
initrd /initrd.img.old
title Debian GNU/Linux, kernel 2.6.25.2 Previous (recovery mode)
root (hd0,0)
kernel /vmlinuz.old root=/dev/md0 ro console=tty0 single
initrd /initrd.img.old
title Debian GNU/Linux, kernel 2.6.25.6
root (hd0,0)
kernel /vmlinuz-2.6.25.6 root=/dev/md0 ro console=tty0
initrd /initrd.img-2.6.25.6
title Debian GNU/Linux, kernel 2.6.25.6 (recovery mode)
root (hd0,0)
kernel /vmlinuz-2.6.25.6 root=/dev/md0 ro console=tty0 single
initrd /initrd.img-2.6.25.6
title Debian GNU/Linux, kernel 2.6.25.2
root (hd0,0)
kernel /vmlinuz-2.6.25.2 root=/dev/md0 ro console=tty0
initrd /initrd.img-2.6.25.2
title Debian GNU/Linux, kernel 2.6.25.2 (recovery mode)
root (hd0,0)
kernel /vmlinuz-2.6.25.2 root=/dev/md0 ro console=tty0 single
initrd /initrd.img-2.6.25.2
title Debian GNU/Linux, kernel 2.6.24
root (hd0,0)
kernel /vmlinuz-2.6.24 root=/dev/md0 ro console=tty0
initrd /initrd.img-2.6.24
title Debian GNU/Linux, kernel 2.6.24 (recovery mode)
root (hd0,0)
kernel /vmlinuz-2.6.24 root=/dev/md0 ro console=tty0 single
initrd /initrd.img-2.6.24
title Debian GNU/Linux, kernel memtest86+
root (hd0,0)
kernel /memtest86+.bin
### END DEBIAN AUTOMAGIC KERNELS LIST
*********************** END /boot/grub/menu.lst
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.25.6 (SMP w/2 CPU cores)
Locale: LANG=C, LC_CTYPE=fi_FI.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages grub depends on:
ii grub-common 1.96+20080704-2 GRand Unified Bootloader, version
grub recommends no packages.
-- no debconf information
More information about the Pkg-grub-devel
mailing list