commit-grub
[Top][All Lists]
Advanced

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

[2418] 2009-07-16 Vladimir Serbinenko <address@hidden>


From: Vladimir Serbinenko
Subject: [2418] 2009-07-16 Vladimir Serbinenko <address@hidden>
Date: Thu, 16 Jul 2009 15:36:44 +0000

Revision: 2418
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2418
Author:   phcoder
Date:     2009-07-16 15:36:43 +0000 (Thu, 16 Jul 2009)
Log Message:
-----------
2009-07-16  Vladimir Serbinenko  <address@hidden>

        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

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/disk/scsi.c
    trunk/grub2/disk/usbms.c
    trunk/grub2/include/grub/disk.h
    trunk/grub2/util/grub-emu.c
    trunk/grub2/util/usb.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog       2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/ChangeLog       2009-07-16 15:36:43 UTC (rev 2418)
@@ -1,5 +1,23 @@
 2009-07-16  Vladimir Serbinenko  <address@hidden>
 
+       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
+
+2009-07-16  Vladimir Serbinenko  <address@hidden>
+
        Fix libusb
 
        * Makefile.in (LIBUSB): new macro

Modified: trunk/grub2/disk/scsi.c
===================================================================
--- trunk/grub2/disk/scsi.c     2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/disk/scsi.c     2009-07-16 15:36:43 UTC (rev 2418)
@@ -248,6 +248,7 @@
     {
       if (p->open (name, scsi))
        continue;
+
       disk->id = (unsigned long) "scsi"; /* XXX */
       disk->data = scsi;
       scsi->dev = p;
@@ -266,7 +267,7 @@
        {
          grub_free (scsi);
          grub_dprintf ("scsi", "inquiry failed\n");
-         return grub_errno;
+         return err;
        }
 
       grub_dprintf ("scsi", "inquiry: devtype=0x%02x removable=%d\n",
@@ -292,7 +293,7 @@
        {
          grub_free (scsi);
          grub_dprintf ("scsi", "READ CAPACITY failed\n");
-         return grub_errno;
+         return err;
        }
 
       /* SCSI blocks can be something else than 512, although GRUB

Modified: trunk/grub2/disk/usbms.c
===================================================================
--- trunk/grub2/disk/usbms.c    2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/disk/usbms.c    2009-07-16 15:36:43 UTC (rev 2418)
@@ -222,11 +222,12 @@
   struct grub_usbms_csw status;
   static grub_uint32_t tag = 0;
   grub_usb_err_t err = GRUB_USB_ERR_NONE;
-  int retrycnt = 3;
+  int retrycnt = 3 + 1;
 
  retry:
+  retrycnt--;
   if (retrycnt == 0)
-    return err;
+    return grub_error (GRUB_ERR_IO, "USB Mass Storage stalled");
 
   /* Setup the request.  */
   grub_memset (&cbw, 0, sizeof (cbw));
@@ -305,9 +306,7 @@
       grub_usb_clear_halt (dev->dev, dev->in->endp_addr);
       grub_usb_clear_halt (dev->dev, dev->out->endp_addr);
 
-      retrycnt--;
-      if (retrycnt)
-       goto retry;
+      goto retry;
     }
 
   if (status.status)

Modified: trunk/grub2/include/grub/disk.h
===================================================================
--- trunk/grub2/include/grub/disk.h     2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/include/grub/disk.h     2009-07-16 15:36:43 UTC (rev 2418)
@@ -173,11 +173,4 @@
 extern grub_err_t (* EXPORT_VAR(grub_disk_ata_pass_through)) (grub_disk_t,
                   struct grub_disk_ata_pass_through_parms *);
 
-#ifdef GRUB_UTIL
-void grub_raid_init (void);
-void grub_raid_fini (void);
-void grub_lvm_init (void);
-void grub_lvm_fini (void);
-#endif
-
 #endif /* ! GRUB_DISK_HEADER */

Modified: trunk/grub2/util/grub-emu.c
===================================================================
--- trunk/grub2/util/grub-emu.c 2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/util/grub-emu.c 2009-07-16 15:36:43 UTC (rev 2418)
@@ -208,10 +208,6 @@
   /* 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.  */

Modified: trunk/grub2/util/usb.c
===================================================================
--- trunk/grub2/util/usb.c      2009-07-16 14:53:33 UTC (rev 2417)
+++ trunk/grub2/util/usb.c      2009-07-16 15:36:43 UTC (rev 2418)
@@ -51,6 +51,7 @@
       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 @@
          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 @@
   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 @@
   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;
+}





reply via email to

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