⬢ DragonFlyBSD Kernel Audit
DF-3678 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/disk/mpt/mpt_cam.c
+++ b/sys/dev/disk/mpt/mpt_cam.c
@@ -1198,6 +1198,16 @@ mpt_cam_detach(struct mpt_softc *mpt)
 	if (mpt->sas_portinfo != NULL) {
+		if (mpt->sas_portinfo->phy_info != NULL) {
+			kfree(mpt->sas_portinfo->phy_info, M_DEVBUF);
+			mpt->sas_portinfo->phy_info = NULL;
+		}
 		kfree(mpt->sas_portinfo, M_DEVBUF);
 		mpt->sas_portinfo = NULL;
 	}
+	if (mpt->tgt_cmd_ptrs != NULL) {
+		kfree(mpt->tgt_cmd_ptrs, M_DEVBUF);
+		mpt->tgt_cmd_ptrs = NULL;
+		mpt->tgt_cmds_allocated = 0;
+	}
+	if (mpt->els_cmd_ptrs != NULL) {
+		kfree(mpt->els_cmd_ptrs, M_DEVBUF);
+		mpt->els_cmd_ptrs = NULL;
+		mpt->els_cmds_allocated = 0;
+	}
 
 	if (mpt->sim != NULL) {
@@ -762,7 +772,11 @@ mpt_read_config_info_sas(struct mpt_softc *mpt)
 	error = mptsas_sas_io_unit_pg0(mpt, portinfo);
 	if (error) {
+		if (portinfo->phy_info != NULL) {
+			kfree(portinfo->phy_info, M_DEVBUF);
+			portinfo->phy_info = NULL;
+		}
 		kfree(portinfo, M_DEVBUF);
 		return (0);
 	}