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
...@@ -228,15 +228,9 @@ static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -494,8 +494,6 @@ enum { ...@@ -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),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment