⬢ DragonFlyBSD Kernel Audit
DF-2491 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/dev/disk/nata/ata-lowlevel.c b/sys/dev/disk/nata/ata-lowlevel.c
index 089a2ac2..1111111 100644
--- a/sys/dev/disk/nata/ata-lowlevel.c
+++ b/sys/dev/disk/nata/ata-lowlevel.c
@@ -771,14 +771,19 @@
 	if (atadev->flags & ATA_D_USE_CHS) {
 	    int heads, sectors;
 
-	    if (atadev->param.atavalid & ATA_FLAG_54_58) {
+	    if ((atadev->param.atavalid & ATA_FLAG_54_58) &&
+		atadev->param.current_heads && atadev->param.current_sectors) {
 		heads = atadev->param.current_heads;
 		sectors = atadev->param.current_sectors;
 	    }
-	    else {
+	    else if (atadev->param.heads && atadev->param.sectors) {
 		heads = atadev->param.heads;
 		sectors = atadev->param.sectors;
 	    }
+	    else {
+		heads = 16;		/* sane fallback geometry */
+		sectors = 63;
+	    }
 
 	    ATA_IDX_OUTB(ch, ATA_SECTOR, (request->u.ata.lba % sectors)+1);
 	    ATA_IDX_OUTB(ch, ATA_CYL_LSB,