Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69197ad7 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: fix memleak on failure in probe_for_drive()



Always free drive->id in probe_for_drive() if device is not present.

While at it:
- remove dead IDE_DFLAG_DEAD flag
- remove superfluous IDE_DFLAG_PRESENT check

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 304ffd6d
Loading
Loading
Loading
Loading
+9 −13
Original line number Original line Diff line number Diff line
@@ -228,15 +228,9 @@ static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id)
	m[ATA_ID_PROD_LEN - 1] = '\0';
	m[ATA_ID_PROD_LEN - 1] = '\0';


	if (strstr(m, "E X A B Y T E N E S T"))
	if (strstr(m, "E X A B Y T E N E S T"))
		goto err_misc;

	drive->dev_flags |= IDE_DFLAG_PRESENT;
	drive->dev_flags &= ~IDE_DFLAG_DEAD;

	return;
err_misc:
	kfree(id);
		drive->dev_flags &= ~IDE_DFLAG_PRESENT;
		drive->dev_flags &= ~IDE_DFLAG_PRESENT;
	else
		drive->dev_flags |= IDE_DFLAG_PRESENT;
}
}


/**
/**
@@ -505,8 +499,7 @@ static u8 probe_for_drive(ide_drive_t *drive)
		}
		}


		if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
		if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
			/* drive not found */
			goto out_free;
			return 0;


		/* identification failed? */
		/* identification failed? */
		if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
		if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
@@ -530,7 +523,7 @@ static u8 probe_for_drive(ide_drive_t *drive)
	}
	}


	if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
	if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
		return 0;
		goto out_free;


	/* The drive wasn't being helpful. Add generic info only */
	/* The drive wasn't being helpful. Add generic info only */
	if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
	if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
@@ -543,7 +536,10 @@ static u8 probe_for_drive(ide_drive_t *drive)
		ide_disk_init_mult_count(drive);
		ide_disk_init_mult_count(drive);
	}
	}


	return !!(drive->dev_flags & IDE_DFLAG_PRESENT);
	return 1;
out_free:
	kfree(drive->id);
	return 0;
}
}


static void hwif_release_dev(struct device *dev)
static void hwif_release_dev(struct device *dev)
+0 −2
Original line number Original line Diff line number Diff line
@@ -494,8 +494,6 @@ enum {
	IDE_DFLAG_NICE1			= (1 << 5),
	IDE_DFLAG_NICE1			= (1 << 5),
	/* device is physically present */
	/* device is physically present */
	IDE_DFLAG_PRESENT		= (1 << 6),
	IDE_DFLAG_PRESENT		= (1 << 6),
	/* device ejected hint */
	IDE_DFLAG_DEAD			= (1 << 7),
	/* id read from device (synthetic if not set) */
	/* id read from device (synthetic if not set) */
	IDE_DFLAG_ID_READ		= (1 << 8),
	IDE_DFLAG_ID_READ		= (1 << 8),
	IDE_DFLAG_NOPROBE		= (1 << 9),
	IDE_DFLAG_NOPROBE		= (1 << 9),