ide: fix memleak on failure in probe_for_drive()
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 27 Mar 2009 11:46:26 +0000 (12:46 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 27 Mar 2009 11:46:26 +0000 (12:46 +0100)
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: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-probe.c
include/linux/ide.h

index a3edbb5d0452bd6ea466beccc0274a0bf3d60734..4b00945cf7d1ad55ef41ad8a68495c718cec913f 100644 (file)
@@ -228,15 +228,9 @@ static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id)
        m[ATA_ID_PROD_LEN - 1] = '\0';
 
        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)
-                       /* drive not found */
-                       return 0;
+                       goto out_free;
 
                /* identification failed? */
                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)
-               return 0;
+               goto out_free;
 
        /* The drive wasn't being helpful. Add generic info only */
        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);
        }
 
-       return !!(drive->dev_flags & IDE_DFLAG_PRESENT);
+       return 1;
+out_free:
+       kfree(drive->id);
+       return 0;
 }
 
 static void hwif_release_dev(struct device *dev)
index 47878719c56b34e762e51a71cf38016946121d74..ab8ee4f32f525520d5605f95e6f3709f8d02318f 100644 (file)
@@ -494,8 +494,6 @@ enum {
        IDE_DFLAG_NICE1                 = (1 << 5),
        /* device is physically present */
        IDE_DFLAG_PRESENT               = (1 << 6),
-       /* device ejected hint */
-       IDE_DFLAG_DEAD                  = (1 << 7),
        /* id read from device (synthetic if not set) */
        IDE_DFLAG_ID_READ               = (1 << 8),
        IDE_DFLAG_NOPROBE               = (1 << 9),