aboutsummaryrefslogtreecommitdiffstats
path: root/main/bubblewrap/realpath-workaround.patch
diff options
context:
space:
mode:
authorEnno Boland <gottox@voidlinux.eu>2018-06-14 11:34:59 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2018-06-14 12:24:00 +0000
commitbef177451e1e50254159685f68b152637ed998d2 (patch)
tree54016b31c8a2a483dfe6cde60491c603adb4135a /main/bubblewrap/realpath-workaround.patch
parent0c4ec076e1c677c618cc85fcd8e0b68198d319ad (diff)
downloadaports-bef177451e1e50254159685f68b152637ed998d2.tar.gz
aports-bef177451e1e50254159685f68b152637ed998d2.tar.bz2
aports-bef177451e1e50254159685f68b152637ed998d2.tar.xz
main/bubblewrap: fix for path normalization without procfs
Instead of using the unnormalized path if realpath() fails this patch introduces a naive approach to normalize the path instead. This fix allows to run various flatpak packages including steam.
Diffstat (limited to 'main/bubblewrap/realpath-workaround.patch')
-rw-r--r--main/bubblewrap/realpath-workaround.patch52
1 files changed, 43 insertions, 9 deletions
diff --git a/main/bubblewrap/realpath-workaround.patch b/main/bubblewrap/realpath-workaround.patch
index 6f1e3b54b0..08bfb4c665 100644
--- a/main/bubblewrap/realpath-workaround.patch
+++ b/main/bubblewrap/realpath-workaround.patch
@@ -1,19 +1,53 @@
Musl realpath() implementation currently depends on /proc which is
not available when setting up pivot root. For the time being just
-fallback to given path if realpath() fails. If there was symlinks
-that would have required normalizing the following parse_mountinfo()
+fallback to a naive normalization algorithm originated from
+VoidLinux' xbps. If there was path that would have required advanced
+normalizing as provided by realpath() the following parse_mountinfo()
will fail.
-diff --git a/bind-mount.c b/bind-mount.c
-index 7d3543f..c33b701 100644
---- a/bind-mount.c
-+++ b/bind-mount.c
-@@ -397,7 +397,7 @@ bind_mount (int proc_fd,
+
+diff --git bind-mount.c.orig bind-mount.c
+index 045fa0e..d05b540 100644
+--- bind-mount.c.orig
++++ bind-mount.c
+@@ -23,6 +23,28 @@
+ #include "utils.h"
+ #include "bind-mount.h"
+
++#ifndef __GLIBC__
++static char *
++normpath(char *path)
++{
++ char *seg = NULL, *p = NULL;
++
++ for (p = path, seg = NULL; *p; p++) {
++ if (strncmp(p, "/../", 4) == 0 || strncmp(p, "/..", 4) == 0) {
++ memmove(seg ? seg : p, p+3, strlen(p+3) + 1);
++ return normpath(path);
++ } else if (strncmp(p, "/./", 3) == 0 || strncmp(p, "/.", 3) == 0) {
++ memmove(p, p+2, strlen(p+2) + 1);
++ } else if (strncmp(p, "//", 2) == 0 || strncmp(p, "/", 2) == 0) {
++ memmove(p, p+1, strlen(p+1) + 1);
++ }
++ if (*p == '/')
++ seg = p;
++ }
++ return path;
++}
++#endif
++
+ static char *
+ skip_token (char *line, bool eat_whitespace)
+ {
+@@ -397,7 +419,11 @@ bind_mount (int proc_fd,
path, so to find it in the mount table we need to do that too. */
resolved_dest = realpath (dest, NULL);
if (resolved_dest == NULL)
-- return 2;
-+ resolved_dest = strdup (dest);
++#ifdef __GLIBC__
+ return 2;
++#else
++ resolved_dest = normpath(strdup(dest));
++#endif
mount_tab = parse_mountinfo (proc_fd, resolved_dest);
if (mount_tab[0].mountpoint == NULL)