From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1iLRaa-0007OE-C2 for mharc-grub-devel@gnu.org; Fri, 18 Oct 2019 08:42:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42937) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iLRaV-0007Jp-5Q for grub-devel@gnu.org; Fri, 18 Oct 2019 08:42:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iLRaT-0006Xf-C2 for grub-devel@gnu.org; Fri, 18 Oct 2019 08:42:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60926) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iLRaP-0006Wi-IY for grub-devel@gnu.org; Fri, 18 Oct 2019 08:42:31 -0400 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CC0944E925 for ; Fri, 18 Oct 2019 12:42:27 +0000 (UTC) Received: by mail-wr1-f71.google.com with SMTP id e25so2035091wra.9 for ; Fri, 18 Oct 2019 05:42:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=nTzs9q6XyrNqwLr2gNaMoXr3DagjNHzm/aExvMuT0Io=; b=Q7Kzhp0xie/y8fYd8zpbqHEmvfbwy+cNIpjyjmETGqzatkfywi3oHfmvmos4M99hDG K2lx95jOcIQr0cERSeLtGy/maFfJymkrcxzPBoN4OWs6zWjCZLdgxN0zLbB8+EJScDDi Q/rJZfx+oypJUVia4o62kwpQ/MYW6Acoq/P/c6ZaM7jCtnBY11Z56XSWoTqfdh3URvvt X1MBBUVpOWhNUTLFkW0M2kBdcsMFJez5RSBmHS8B2LYOm3wLPu7GeZGP7HbxMAKpJ/tn UoyVup3+XEYp/a8EwQkfUKmyKSa4eWaxyvNhS6bJ1GWRwQqLNUvvZ4e35BahsMhyRt7q 4vbQ== X-Gm-Message-State: APjAAAXrxbBlR5Ad/4vVUD2lNjrQJlG/4F3sIy4how+oQF9uVx0PQVt6 Y0WyufFxagG+jXYZ8/UZq2OQ7jEXs5wy+MV++BITPNNybS7+QiCPC5rld643vJCTZ4KeplPBOvb oOTBfDkWiqZk= X-Received: by 2002:a1c:770b:: with SMTP id t11mr3544308wmi.147.1571402546309; Fri, 18 Oct 2019 05:42:26 -0700 (PDT) X-Google-Smtp-Source: APXvYqwMDyyfOO4ys5emKuje8xfHMY0RzTwJqYdrbQIF7QlTizdhHE38aB9kaLM5rk8o2h8EraNB2Q== X-Received: by 2002:a1c:770b:: with SMTP id t11mr3544292wmi.147.1571402546067; Fri, 18 Oct 2019 05:42:26 -0700 (PDT) Received: from minerva.redhat.com ([90.168.169.92]) by smtp.gmail.com with ESMTPSA id c4sm5348400wru.31.2019.10.18.05.42.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Oct 2019 05:42:25 -0700 (PDT) From: Javier Martinez Canillas To: grub-devel@gnu.org Cc: Peter Jones , Adam Jackson , Javier Martinez Canillas Subject: [PATCH 2/2] Make editenv chase symlinks including those across devices. Date: Fri, 18 Oct 2019 14:42:21 +0200 Message-Id: <20191018124221.15934-2-javierm@redhat.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191018124221.15934-1-javierm@redhat.com> References: <20191018124221.15934-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Oct 2019 12:42:37 -0000 From: Peter Jones This lets us make /boot/grub2/grubenv a symlink to /boot/efi/EFI/fedora/grubenv even though they're different mount points, which allows /usr/bin/grub2-editenv to be the same across platforms (i.e. UEFI vs BIOS). Signed-off-by: Peter Jones Reviewed-by: Adam Jackson Signed-off-by: Javier Martinez Canillas --- Makefile.util.def | 11 +++++++++++ util/editenv.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/Makefile.util.def b/Makefile.util.def index 969d32f0097..733a397cb2b 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -240,8 +240,19 @@ program =3D { =20 common =3D util/grub-editenv.c; common =3D util/editenv.c; + common =3D util/grub-install-common.c; common =3D grub-core/osdep/init.c; + common =3D grub-core/osdep/compress.c; + extra_dist =3D grub-core/osdep/unix/compress.c; + extra_dist =3D grub-core/osdep/basic/compress.c; + common =3D util/mkimage.c; + common =3D util/grub-mkimage32.c; + common =3D util/grub-mkimage64.c; + common =3D grub-core/osdep/config.c; + common =3D util/config.c; + common =3D util/resolve.c; =20 + ldadd =3D '$(LIBLZMA)'; ldadd =3D libgrubmods.a; ldadd =3D libgrubgcry.a; ldadd =3D libgrubkern.a; diff --git a/util/editenv.c b/util/editenv.c index eb2d0c03a98..e61dc1283a4 100644 --- a/util/editenv.c +++ b/util/editenv.c @@ -37,6 +37,7 @@ grub_util_create_envblk_file (const char *name) FILE *fp; char *buf; char *namenew; + char *rename_target =3D xstrdup(name); =20 buf =3D xmalloc (DEFAULT_ENVBLK_SIZE); =20 @@ -60,7 +61,48 @@ grub_util_create_envblk_file (const char *name) free (buf); fclose (fp); =20 - if (grub_util_rename (namenew, name) < 0) - grub_util_error (_("cannot rename the file %s to %s"), namenew, name= ); + ssize_t size =3D 1; + while (1) + { + char *linkbuf; + ssize_t retsize; + + linkbuf =3D xmalloc(size+1); + retsize =3D grub_util_readlink (rename_target, linkbuf, size); + if (retsize < 0 && (errno =3D=3D ENOENT || errno =3D=3D EINVAL)) + { + free (linkbuf); + break; + } + else if (retsize < 0) + { + grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, n= ame); + free (linkbuf); + free (namenew); + return; + } + else if (retsize =3D=3D size) + { + free(linkbuf); + size +=3D 128; + continue; + } + + free (rename_target); + linkbuf[retsize] =3D '\0'; + rename_target =3D linkbuf; + } + + int rc =3D grub_util_rename (namenew, rename_target); + if (rc < 0 && errno =3D=3D EXDEV) + { + rc =3D grub_install_copy_file (namenew, rename_target, 1); + grub_util_unlink (namenew); + } + + if (rc < 0) + grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, = name); + free (namenew); + free (rename_target); } --=20 2.21.0