]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/disk/pata.c (grub_pata_readwrite): Fix ATAPI protocol error.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 29 Feb 2012 11:45:32 +0000 (12:45 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 29 Feb 2012 11:45:32 +0000 (12:45 +0100)
ChangeLog
grub-core/disk/pata.c

index 06c93425518e4e6116e9c8d30246ba6983016b0b..c4b1ae4c843fb43987289897bdcae9185fef784c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2012-02-29  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/disk/pata.c (grub_pata_readwrite): Fix ATAPI protocol error.
+
 2012-02-28  Vladimir Serbinenko  <phcoder@gmail.com>
 
        Fix make dist.
index 089059d10aa1800608382423b242e08d63abd496..5fc11ee91723fe57416d79d0f9d6b24b2650166d 100644 (file)
@@ -203,11 +203,8 @@ grub_pata_readwrite (struct grub_ata *disk,
 
   /* Transfer data.  */
   while (nread < parms->size
-        && ((sts & (GRUB_ATA_STATUS_DRQ | GRUB_ATA_STATUS_ERR))
-            == GRUB_ATA_STATUS_DRQ)
-        && (!parms->cmdsize 
-            || ((grub_pata_regget (dev, GRUB_ATAPI_REG_IREASON)
-                 & GRUB_ATAPI_IREASON_MASK) == GRUB_ATAPI_IREASON_DATA_IN)))
+        && (sts & (GRUB_ATA_STATUS_DRQ | GRUB_ATA_STATUS_ERR))
+        == GRUB_ATA_STATUS_DRQ)
     {
       unsigned cnt;
 
@@ -217,6 +214,10 @@ grub_pata_readwrite (struct grub_ata *disk,
 
       if (parms->cmdsize)
        {
+         if ((grub_pata_regget (dev, GRUB_ATAPI_REG_IREASON)
+              & GRUB_ATAPI_IREASON_MASK) != GRUB_ATAPI_IREASON_DATA_IN)
+           return grub_error (GRUB_ERR_READ_ERROR, "ATAPI protocol error");
+
          cnt = grub_pata_regget (dev, GRUB_ATAPI_REG_CNTHIGH) << 8
            | grub_pata_regget (dev, GRUB_ATAPI_REG_CNTLOW);
          grub_dprintf("pata", "DRQ count=%u\n", cnt);