diff --git a/ChangeLog b/ChangeLog index 06c934255..c4b1ae4c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2012-02-29 Vladimir Serbinenko + + * grub-core/disk/pata.c (grub_pata_readwrite): Fix ATAPI protocol error. + 2012-02-28 Vladimir Serbinenko Fix make dist. diff --git a/grub-core/disk/pata.c b/grub-core/disk/pata.c index 089059d10..5fc11ee91 100644 --- a/grub-core/disk/pata.c +++ b/grub-core/disk/pata.c @@ -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);