* grub-core/fs/btrfs.c (grub_btrfs_dir): Fix memory leak.
* grub-core/fs/cpio.c (grub_cpio_find_file): Likewise.
(grub_cpio_dir): Likewise.
* grub-core/fs/fat.c (grub_fat_label): Likewise.
* grub-core/fs/jfs.c (grub_jfs_label): Likewise.
* grub-core/fs/romfs.c (grub_romfs_close): Likewise.
(grub_romfs_label): Likewise.
* grub-core/fs/squash4.c (squash_mount): Use zalloc for safety.
(squash_unmount): New function.
(grub_squash_dir): Fix memory leak.
(grub_squash_open): Likewise.
(grub_squash_read): Likewise.
(grub_squash_mtime): Likewise.
* grub-core/fs/xfs.c (grub_xfs_open): Likewise.
* grub-core/fs/zfs/zfs.c (check_pool_label): Likewise.
* util/grub-fstest.c (fstest): Likewise.
+2011-11-09 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Fix several memory leaks.
+
+ * grub-core/fs/btrfs.c (grub_btrfs_dir): Fix memory leak.
+ * grub-core/fs/cpio.c (grub_cpio_find_file): Likewise.
+ (grub_cpio_dir): Likewise.
+ * grub-core/fs/fat.c (grub_fat_label): Likewise.
+ * grub-core/fs/jfs.c (grub_jfs_label): Likewise.
+ * grub-core/fs/romfs.c (grub_romfs_close): Likewise.
+ (grub_romfs_label): Likewise.
+ * grub-core/fs/squash4.c (squash_mount): Use zalloc for safety.
+ (squash_unmount): New function.
+ (grub_squash_dir): Fix memory leak.
+ (grub_squash_open): Likewise.
+ (grub_squash_read): Likewise.
+ (grub_squash_mtime): Likewise.
+ * grub-core/fs/xfs.c (grub_xfs_open): Likewise.
+ * grub-core/fs/zfs/zfs.c (check_pool_label): Likewise.
+ * util/grub-fstest.c (fstest): Likewise.
+
2011-11-09 Vladimir Serbinenko <phcoder@gmail.com>
* include/grub/misc.h (grub_strncat): Fix the order of conditionals to
err = find_path (data, path, &key_in, &tree, &type);
if (err)
- return err;
+ {
+ grub_btrfs_unmount (data);
+ return err;
+ }
if (type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY)
- return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
+ {
+ grub_btrfs_unmount (data);
+ return grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
+ }
err = lower_bound (data, &key_in, &key_out, tree, &elemaddr, &elemsize, &desc);
if (err)
- return err;
+ {
+ grub_btrfs_unmount (data);
+ return err;
+ }
if (key_out.type != GRUB_BTRFS_ITEM_TYPE_DIR_ITEM
|| key_out.object_id != key_in.object_id)
{
r = next (data, &desc, &elemaddr, &elemsize, &key_out);
if (r <= 0)
- {
- free_iterator (&desc);
- return -r;
- }
+ goto out;
}
do
{
direl = grub_malloc (allocated + 1);
if (!direl)
{
- free_iterator (&desc);
- return grub_errno;
+ r = -grub_errno;
+ break;
}
}
err = grub_btrfs_read_logical (data, elemaddr, direl, elemsize);
if (err)
- return err;
+ {
+ r = -err;
+ break;
+ }
for (cdirel = direl;
(grub_uint8_t *) cdirel - (grub_uint8_t *) direl
&& grub_memcmp(*name, "TRAILER!!!", 11) == 0)
{
*ofs = 0;
+ grub_free (*name);
return GRUB_ERR_NONE;
}
}
}
}
+ else
+ grub_free (name);
data->hofs = ofs;
}
grub_size_t chc;
*label = grub_malloc (11 * 4 + 1);
if (!*label)
- return grub_errno;
+ {
+ grub_free (data);
+ return grub_errno;
+ }
chc = dir.type_specific.volume_label.character_count;
if (chc > ARRAY_SIZE (dir.type_specific.volume_label.str))
chc = ARRAY_SIZE (dir.type_specific.volume_label.str);
}
}
+ grub_free (data);
return grub_errno;
}
else
*label = 0;
+ grub_free (data);
+
return grub_errno;
}
\f
static grub_err_t
grub_romfs_close (grub_file_t file)
{
- grub_free (file->data);
+ struct grub_fshelp_node *data = file->data;
+
+ grub_free (data->data);
+ grub_free (data);
return GRUB_ERR_NONE;
}
return err;
}
(*label)[data->first_file - sizeof (struct grub_romfs_superblock)] = 0;
+ grub_free (data);
return GRUB_ERR_NONE;
}
if (err)
return NULL;
- data = grub_malloc (sizeof (*data));
+ data = grub_zalloc (sizeof (*data));
if (!data)
return NULL;
data->sb = sb;
grub_cpu_to_le16 (data->sb.root_ino_offset));
}
+static void
+squash_unmount (struct grub_squash_data *data)
+{
+ grub_free (data->ino.cumulated_block_sizes);
+ grub_free (data->ino.block_sizes);
+ grub_free (data);
+}
+
+
static grub_err_t
grub_squash_dir (grub_device_t device, const char *path,
int (*hook) (const char *filename,
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
info.mtimeset = 1;
info.mtime = grub_le_to_cpu32 (node->ino.mtime);
+ grub_free (node);
return hook (filename, &info);
}
if (!grub_errno)
grub_squash_iterate_dir (fdiro, iterate);
- grub_free (data);
+ squash_unmount (data);
return grub_errno;
}
grub_squash_read_symlink, GRUB_FSHELP_REG);
if (grub_errno)
{
- grub_free (data);
+ squash_unmount (data);
return grub_errno;
}
else
file->size = grub_le_to_cpu32 (fdiro->ino.file.size);
+ grub_free (fdiro);
+
return GRUB_ERR_NONE;
}
static grub_err_t
grub_squash_close (grub_file_t file)
{
- grub_free (file->data);
+ squash_unmount (file->data);
return GRUB_ERR_NONE;
}
if (! data)
return grub_errno;
*tm = grub_le_to_cpu32 (data->sb.creation_time);
- grub_free (data);
+ squash_unmount (data);
return GRUB_ERR_NONE;
}
}
if (fdiro != &data->diropen)
- grub_memcpy (&data->diropen, fdiro,
- sizeof (struct grub_fshelp_node)
- - sizeof (struct grub_xfs_inode)
- + (1 << data->sblock.log2_inode));
+ {
+ grub_memcpy (&data->diropen, fdiro,
+ sizeof (struct grub_fshelp_node)
+ - sizeof (struct grub_xfs_inode)
+ + (1 << data->sblock.log2_inode));
+ grub_free (fdiro);
+ }
file->size = grub_be_to_cpu64 (data->diropen.inode.size);
file->data = data;
err = fill_vdev_info (data, nv, diskdesc);
if (err)
{
+ grub_free (nv);
grub_free (nvlist);
return err;
}
+ grub_free (nv);
}
grub_dprintf ("zfs", "check 10 passed\n");
if (!uuid)
grub_util_error ("couldn't retrieve UUID");
argv[1] = uuid;
- execute_command ("xnu_uuid", 2, argv);
+ execute_command ("xnu_uuid", 2, argv);
+ grub_free (uuid);
+ grub_device_close (dev);
}
}