On Mon, Oct 28, 2019 at 02:11:10PM +0100, Javier Martinez Canillas wrote: > From: Peter Jones <pjo...@redhat.com> > > The grub-editenv create command will wrongly overwrite /boot/grub2/grubenv > with a regular file if grubenv is a symbolic link. But instead, it should > create a new file in the path the symlink points to. > > This lets /boot/grub2/grubenv be a symlink to /boot/efi/EFI/fedora/grubenv > even when they're different mount points, which allows grub2-editenv to be > the same across platforms (i.e. UEFI vs BIOS). > > For example, in Fedora the GRUB EFI builds have prefix set to /EFI/fedora > (on the EFI System Partition), but for BIOS machine it'll be /boot/grub2 > (which may or may not be its own mountpoint). > > With this patch, on EFI machines we can make /boot/grub2/grubenv a symlink > to /boot/efi/EFI/fedora/grubenv, and the same copy of grub-set-default will > work on both kinds of systems. > > Signed-off-by: Peter Jones <pjo...@redhat.com> > Signed-off-by: Jonathan Lebon <jle...@redhat.com> > Reviewed-by: Adam Jackson <a...@redhat.com> > Signed-off-by: Javier Martinez Canillas <javi...@redhat.com> > > --- > > Changes in v2: > - Address issues pointed out by Daniel Kiper in the previous version. > > Makefile.util.def | 11 +++++++++ > util/editenv.c | 59 +++++++++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 68 insertions(+), 2 deletions(-) > > diff --git Makefile.util.def Makefile.util.def > index 969d32f0097..733a397cb2b 100644 > --- Makefile.util.def > +++ Makefile.util.def > @@ -240,8 +240,19 @@ program = { > > common = util/grub-editenv.c; > common = util/editenv.c; > + common = util/grub-install-common.c; > common = grub-core/osdep/init.c; > + common = grub-core/osdep/compress.c; > + extra_dist = grub-core/osdep/unix/compress.c; > + extra_dist = grub-core/osdep/basic/compress.c; > + common = util/mkimage.c; > + common = util/grub-mkimage32.c; > + common = util/grub-mkimage64.c; > + common = grub-core/osdep/config.c; > + common = util/config.c; > + common = util/resolve.c; > > + ldadd = '$(LIBLZMA)'; > ldadd = libgrubmods.a; > ldadd = libgrubgcry.a; > ldadd = libgrubkern.a; > diff --git util/editenv.c util/editenv.c > index eb2d0c03a98..accc08407d9 100644 > --- util/editenv.c > +++ util/editenv.c > @@ -28,15 +28,19 @@ > > #include <errno.h> > #include <string.h> > +#include <libgen.h> > > #define DEFAULT_ENVBLK_SIZE 1024 > > void > grub_util_create_envblk_file (const char *name) > { > + int rc; > FILE *fp; > char *buf; > char *namenew; > + ssize_t size = 1; > + char *rename_target = xstrdup (name);
What will happen if rename_target is NULL? > buf = xmalloc (DEFAULT_ENVBLK_SIZE); > > @@ -60,7 +64,58 @@ grub_util_create_envblk_file (const char *name) > free (buf); > fclose (fp); > > - if (grub_util_rename (namenew, name) < 0) > - grub_util_error (_("cannot rename the file %s to %s"), namenew, name); > + while (1) > + { > + char *linkbuf; > + ssize_t retsize; > + > + linkbuf = xmalloc (size+1); Please check for NULL here. And "size + 1". In general I will not accept any patch which does not check for NULL for malloc() et consortes. > + retsize = grub_util_readlink (rename_target, linkbuf, size); > + if (retsize < 0 && (errno == ENOENT || errno == EINVAL)) > + { > + free (linkbuf); > + break; > + } > + else if (retsize < 0) > + { > + grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, > name); > + free (linkbuf); > + free (namenew); > + return; > + } > + else if (retsize == size) > + { > + free (linkbuf); > + size += 128; > + continue; > + } > + > + linkbuf[retsize] = '\0'; > + if (linkbuf[0] == '/') > + { > + free (rename_target); > + rename_target = linkbuf; > + } > + else > + { > + char *dbuf = xstrdup (rename_target); What happens if dbuf is NULL? > + const char *dir = dirname (dbuf); Empty line please... > + free (rename_target); > + rename_target = xasprintf ("%s/%s", dir, linkbuf); NULL? Daniel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel