c789522
From 098987b7b5fcc15a5ba3600fa132fcec36095c5a Mon Sep 17 00:00:00 2001
6f1e3d5
From: Jonathan Lebon <jlebon@redhat.com>
6f1e3d5
Date: Mon, 14 Aug 2017 14:37:20 -0400
31cddd6
Subject: [PATCH] editenv: handle relative symlinks
6f1e3d5
6f1e3d5
Handle symlinks with targets relative to the containing dir. This
6f1e3d5
ensures that the rename operation does not depend on the cwd.
6f1e3d5
6f1e3d5
Resolves: rhbz#1479960
6f1e3d5
6f1e3d5
Signed-off-by: Jonathan Lebon <jlebon@redhat.com>
6f1e3d5
---
6f1e3d5
 util/editenv.c | 16 ++++++++++++++--
6f1e3d5
 1 file changed, 14 insertions(+), 2 deletions(-)
6f1e3d5
6f1e3d5
diff --git a/util/editenv.c b/util/editenv.c
ec4acbb
index d8d1dad6ab9..41bc7cb1c9a 100644
6f1e3d5
--- a/util/editenv.c
6f1e3d5
+++ b/util/editenv.c
6f1e3d5
@@ -28,6 +28,7 @@
6f1e3d5
 
6f1e3d5
 #include <errno.h>
6f1e3d5
 #include <string.h>
6f1e3d5
+#include <libgen.h>
6f1e3d5
 
6f1e3d5
 #define DEFAULT_ENVBLK_SIZE	1024
6f1e3d5
 
6f1e3d5
@@ -87,9 +88,20 @@ grub_util_create_envblk_file (const char *name)
6f1e3d5
 	  continue;
6f1e3d5
 	}
6f1e3d5
 
6f1e3d5
-      free (rename_target);
6f1e3d5
       linkbuf[retsize] = '\0';
6f1e3d5
-      rename_target = linkbuf;
6f1e3d5
+      if (linkbuf[0] == '/')
6f1e3d5
+        {
6f1e3d5
+          free (rename_target);
6f1e3d5
+          rename_target = linkbuf;
6f1e3d5
+        }
6f1e3d5
+      else
6f1e3d5
+        {
6f1e3d5
+          char *dbuf = xstrdup (rename_target);
6f1e3d5
+          const char *dir = dirname (dbuf);
6f1e3d5
+          free (rename_target);
6f1e3d5
+          rename_target = xasprintf("%s/%s", dir, linkbuf);
6f1e3d5
+          free (dbuf);
6f1e3d5
+        }
6f1e3d5
     }
6f1e3d5
 
6f1e3d5
   int rc = grub_util_rename (namenew, rename_target);