⬢ DragonFlyBSD Kernel Audit
DF-4692 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/disk/sili/sili_pm.c
+++ b/sys/dev/disk/sili/sili_pm.c
@@ -546,6 +546,11 @@ sili_pm_set_feature(struct sili_port *ap, int feature, int enable)
 	struct ata_xfer	*xa;
 	int error;
 
 	xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]);
+	if (xa == NULL) {
+		kprintf("%s: PM set_feature failed, no free ccbs\n",
+			PORTNAME(ap));
+		return (EBUSY);
+	}
 
 	xa->fis->type = ATA_FIS_TYPE_H2D;
 	xa->fis->flags = ATA_H2D_FLAGS_CMD | 15;
@@ -640,6 +645,12 @@ sili_pm_read(struct sili_port *ap, int target, int which, u_int32_t *datap)
 	struct ata_xfer	*xa;
 	int error;
 
 	xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]);
+	if (xa == NULL) {
+		kprintf("%s.%d pm_read SCA[%d] failed, no free ccbs\n",
+			PORTNAME(ap), target, which);
+		*datap = 0;
+		return (EBUSY);
+	}
 
 	xa->fis->type = ATA_FIS_TYPE_H2D;
 	xa->fis->command = ATA_C_READ_PM;
@@ -677,6 +688,12 @@ sili_pm_write(struct sili_port *ap, int target, int which, u_int32_t data)
 	struct ata_xfer	*xa;
 	int error;
 
 	xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]);
+	if (xa == NULL) {
+		kprintf("%s.%d pm_write SCA[%d] failed, no free ccbs\n",
+			PORTNAME(ap), target, which);
+		return (EBUSY);
+	}
 
 	xa->fis->type = ATA_FIS_TYPE_H2D;
 	xa->fis->command = ATA_C_WRITE_PM;