2009-07-16 Vladimir Serbinenko <phcoder@gmail.com>

Fix hang and segmentation fault in grub-emu-usb

	* disk/scsi.c (grub_scsi_open): return err and not grub_errno
	* util/usb.c (grub_libusb_devices): likewise
	(grub_libusb_init): rename to ...
	(GRUB_MOD_INIT (libusb)):...this
	(grub_libusb_fini): rename to ..
	(GRUB_MOD_FINI (libusb)):...this
	* disk/usbms.c (grub_usbms_transfer): fix retry logic
	* include/grub/disk.h (grub_raid_init): removed, it's useless
	(grub_raid_fini): likewise
	(grub_lvm_init): likewise
	(grub_lvm_fini): likewise
	* util/grub-emu.c (main): don't call grub_libusb_init, it's done
	by grub_init_all
This commit is contained in:
phcoder 2009-07-16 15:36:43 +00:00
parent 94414221cf
commit ee293aee1b
6 changed files with 51 additions and 40 deletions

View file

@ -208,10 +208,6 @@ main (int argc, char *argv[])
/* XXX: This is a bit unportable. */
grub_util_biosdisk_init (dev_map);
#if HAVE_USB_H
grub_libusb_init ();
#endif
grub_init_all ();
/* Make sure that there is a root device. */

View file

@ -51,6 +51,7 @@ grub_libusb_devices (void)
for (usbdev = bus->devices; usbdev; usbdev = usbdev->next)
{
struct usb_device_descriptor *desc = &usbdev->descriptor;
grub_err_t err;
if (! desc->bcdUSB)
continue;
@ -62,7 +63,12 @@ grub_libusb_devices (void)
dev->data = usbdev;
/* Fill in all descriptors. */
grub_usb_device_initialize (dev);
err = grub_usb_device_initialize (dev);
if (err)
{
grub_errno = GRUB_ERR_NONE;
continue;
}
/* Register the device. */
grub_usb_devs[last++] = dev;
@ -72,27 +78,6 @@ grub_libusb_devices (void)
return GRUB_USB_ERR_NONE;
}
grub_err_t
grub_libusb_init (void)
{
usb_init();
usb_find_busses();
usb_find_devices();
if (grub_libusb_devices ())
return grub_errno;
grub_usb_controller_dev_register (&usb_controller);
return 0;
}
grub_err_t
grub_libusb_fini (void)
{
return 0;
}
int
grub_usb_iterate (int (*hook) (grub_usb_device_t dev))
@ -189,3 +174,22 @@ grub_usb_bulk_write (grub_usb_device_t dev,
usb_close (devh);
return GRUB_USB_ERR_STALL;
}
GRUB_MOD_INIT (libusb)
{
usb_init();
usb_find_busses();
usb_find_devices();
if (grub_libusb_devices ())
return;
grub_usb_controller_dev_register (&usb_controller);
return;
}
GRUB_MOD_FINI (libusb)
{
return;
}