commands/probe: Fix resource leaks

Commit 1fc860bb76 (commands/probe: Fix a resource leak when probing disks),
missed other cases where grub_device_close() should be called before a return
statement is called. Also found that grub_disk_close() wasn't being called when
an error is being returned. To avoid conflict with grub_errno, grub_error_push()
should be called before either grub_device_close() or grub_disk_close() is
called and grub_error_pop() should be called before grub_errno is returned.

Fixes: 1fc860bb76 (commands/probe: Fix a resource leak when probing disks)
Fixes: CID 292443

Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Alec Brown authored and Daniel Kiper committed 2021-11-22 16:03:15 +01:00
1 parent 5983c2c6ad
commit 07d7bdb786
1 file changed
+43 -14
+43 -14
View File
@@ -122,7 +122,13 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
grub_gpt_part_guid_t *guid; grub_gpt_part_guid_t *guid;
if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry)) if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry))
return grub_errno; {
grub_error_push ();
grub_disk_close (disk);
grub_device_close (dev);
grub_error_pop ();
return grub_errno;
}
guid = &entry.guid; guid = &entry.guid;
grub_snprintf (val, sizeof(val), grub_snprintf (val, sizeof(val),
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
@@ -153,7 +159,12 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
} }
fs = grub_fs_probe (dev); fs = grub_fs_probe (dev);
if (! fs) if (! fs)
return grub_errno; {
grub_error_push ();
grub_device_close (dev);
grub_error_pop ();
return grub_errno;
}
if (state[3].set) if (state[3].set)
{ {
if (state[0].set) if (state[0].set)
@@ -167,14 +178,23 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
{ {
char *uuid; char *uuid;
if (! fs->fs_uuid) if (! fs->fs_uuid)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, {
N_("%s does not support UUIDs"), fs->name); grub_device_close (dev);
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("%s does not support UUIDs"), fs->name);
}
err = fs->fs_uuid (dev, &uuid); err = fs->fs_uuid (dev, &uuid);
if (err) if (err)
return err; {
grub_device_close (dev);
return err;
}
if (! uuid) if (! uuid)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, {
N_("%s does not support UUIDs"), fs->name); grub_device_close (dev);
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("%s does not support UUIDs"), fs->name);
}
if (state[0].set) if (state[0].set)
grub_env_set (state[0].arg, uuid); grub_env_set (state[0].arg, uuid);
@@ -188,16 +208,25 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
{ {
char *label; char *label;
if (! fs->fs_label) if (! fs->fs_label)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, {
N_("filesystem `%s' does not support labels"), grub_device_close (dev);
fs->name); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("filesystem `%s' does not support labels"),
fs->name);
}
err = fs->fs_label (dev, &label); err = fs->fs_label (dev, &label);
if (err) if (err)
return err; {
grub_device_close (dev);
return err;
}
if (! label) if (! label)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, {
N_("filesystem `%s' does not support labels"), grub_device_close (dev);
fs->name); return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("filesystem `%s' does not support labels"),
fs->name);
}
if (state[0].set) if (state[0].set)
grub_env_set (state[0].arg, label); grub_env_set (state[0].arg, label);