From a8c48fd53d9376a0b563b1238f4741709831501e Mon Sep 17 00:00:00 2001 From: phcoder Date: Sun, 29 Mar 2009 21:21:19 +0000 Subject: [PATCH] 2009-03-29 Vladimir Serbinenko Leak fixes * kern/disk.c (grub_disk_cache_store): Invalidate previous cache in case of collision * disk/scsi.c (grub_scsi_open): free scsi in case of error --- ChangeLog | 8 ++++++++ disk/scsi.c | 6 ++++++ kern/disk.c | 7 +++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0afef5099..950710103 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-03-29 Vladimir Serbinenko + + Leak fixes + + * kern/disk.c (grub_disk_cache_store): Invalidate previous cache + in case of collision + * disk/scsi.c (grub_scsi_open): free scsi in case of error + 2009-03-29 Robert Millan * loader/i386/linux.c (grub_cmd_linux): Parse "vga=" parameter and diff --git a/disk/scsi.c b/disk/scsi.c index 75b92b409..319d8d672 100644 --- a/disk/scsi.c +++ b/disk/scsi.c @@ -255,6 +255,7 @@ grub_scsi_open (const char *name, grub_disk_t disk) scsi->name = grub_strdup (name); if (! scsi->name) { + grub_free (scsi); return grub_errno; } @@ -263,6 +264,7 @@ grub_scsi_open (const char *name, grub_disk_t disk) err = grub_scsi_inquiry (scsi); if (err) { + grub_free (scsi); grub_dprintf ("scsi", "inquiry failed\n"); return grub_errno; } @@ -275,6 +277,7 @@ grub_scsi_open (const char *name, grub_disk_t disk) if (scsi->devtype != grub_scsi_devtype_direct && scsi->devtype != grub_scsi_devtype_cdrom) { + grub_free (scsi); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown SCSI device"); } @@ -287,6 +290,7 @@ grub_scsi_open (const char *name, grub_disk_t disk) err = grub_scsi_read_capacity (scsi); if (err) { + grub_free (scsi); grub_dprintf ("scsi", "READ CAPACITY failed\n"); return grub_errno; } @@ -303,6 +307,8 @@ grub_scsi_open (const char *name, grub_disk_t disk) } } + grub_free (scsi); + return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a SCSI disk"); } diff --git a/kern/disk.c b/kern/disk.c index 4ee03e0d9..8a92989ad 100644 --- a/kern/disk.c +++ b/kern/disk.c @@ -158,10 +158,13 @@ grub_disk_cache_store (unsigned long dev_id, unsigned long disk_id, unsigned index; struct grub_disk_cache *cache; - grub_disk_cache_invalidate (dev_id, disk_id, sector); - index = grub_disk_cache_get_index (dev_id, disk_id, sector); cache = grub_disk_cache_table + index; + + cache->lock = 1; + grub_free (cache->data); + cache->data = 0; + cache->lock = 0; cache->data = grub_malloc (GRUB_DISK_SECTOR_SIZE << GRUB_DISK_CACHE_BITS); if (! cache->data)