util/grub-install: Delay copying files to {grubdir,platdir} after install_device was validated

Previously grub-install copied modules to grubdir before doing any
validation on the install_device.

When grub-install was called with an invalid install_device, modules
were already copied to /boot before it found out and was forced to rely
on atexit() rollback.

This patch delays copying the modules after at least some install_device
validation was done, and thus reduces reliance on successful rollback.

Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Mate Kukri 2023-11-24 08:32:57 +00:00 committed by Daniel Kiper
parent e60015f574
commit 3f9eace2d3

View File

@ -1291,13 +1291,6 @@ main (int argc, char *argv[])
}
}
grub_install_copy_files (grub_install_source_directory,
grubdir, platform);
char *envfile = grub_util_path_concat (2, grubdir, "grubenv");
if (!grub_util_is_regular (envfile))
grub_util_create_envblk_file (envfile);
size_t ndev = 0;
/* Write device to a variable so we don't have to traverse /dev every time. */
@ -1384,18 +1377,7 @@ main (int argc, char *argv[])
t);
free (t);
}
load_cfg = grub_util_path_concat (2, platdir,
"load.cfg");
grub_util_unlink (load_cfg);
if (debug_image && debug_image[0])
{
load_cfg_f = grub_util_fopen (load_cfg, "wb");
have_load_cfg = 1;
fprintf (load_cfg_f, "set debug='%s'\n",
debug_image);
}
char *prefix_drive = NULL;
char *install_drive = NULL;
@ -1419,6 +1401,26 @@ main (int argc, char *argv[])
}
}
grub_install_copy_files (grub_install_source_directory,
grubdir, platform);
char *envfile = grub_util_path_concat (2, grubdir, "grubenv");
if (!grub_util_is_regular (envfile))
grub_util_create_envblk_file (envfile);
load_cfg = grub_util_path_concat (2, platdir,
"load.cfg");
grub_util_unlink (load_cfg);
if (debug_image && debug_image[0])
{
load_cfg_f = grub_util_fopen (load_cfg, "wb");
have_load_cfg = 1;
fprintf (load_cfg_f, "set debug='%s'\n",
debug_image);
}
if (!have_abstractions)
{
if ((disk_module && grub_strcmp (disk_module, "biosdisk") != 0)