From 7029caf09849bb83183e9b68dd1dce78db494c3f Mon Sep 17 00:00:00 2001 From: UsernameRandomlyGenerated Date: Sat, 5 Feb 2022 17:50:21 +0100 Subject: [PATCH 1/2] musl: add readlink and realpath patches, update homepage --- srcpkgs/musl/patches/readlink.patch | 41 +++++++ srcpkgs/musl/patches/realpath.patch | 184 ++++++++++++++++++++++++++++ srcpkgs/musl/template | 6 +- 3 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 srcpkgs/musl/patches/readlink.patch create mode 100644 srcpkgs/musl/patches/realpath.patch diff --git a/srcpkgs/musl/patches/readlink.patch b/srcpkgs/musl/patches/readlink.patch new file mode 100644 index 000000000000..06f359168a2d --- /dev/null +++ b/srcpkgs/musl/patches/readlink.patch @@ -0,0 +1,41 @@ +diff --git a/src/unistd/readlink.c b/src/unistd/readlink.c +index a152d524..32f4537f 100644 +--- a/src/unistd/readlink.c ++++ b/src/unistd/readlink.c +@@ -4,9 +4,16 @@ + + ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize) + { ++ char dummy[1]; ++ if (!bufsize) { ++ buf = dummy; ++ bufsize = 1; ++ } + #ifdef SYS_readlink +- return syscall(SYS_readlink, path, buf, bufsize); ++ int r = __syscall(SYS_readlink, path, buf, bufsize); + #else +- return syscall(SYS_readlinkat, AT_FDCWD, path, buf, bufsize); ++ int r = __syscall(SYS_readlinkat, AT_FDCWD, path, buf, bufsize); + #endif ++ if (buf == dummy && r > 0) r = 0; ++ return __syscall_ret(r); + } +diff --git a/src/unistd/readlinkat.c b/src/unistd/readlinkat.c +index 9af45cd5..f79d3d14 100644 +--- a/src/unistd/readlinkat.c ++++ b/src/unistd/readlinkat.c +@@ -3,5 +3,12 @@ + + ssize_t readlinkat(int fd, const char *restrict path, char *restrict buf, size_t bufsize) + { +- return syscall(SYS_readlinkat, fd, path, buf, bufsize); ++ char dummy[1]; ++ if (!bufsize) { ++ buf = dummy; ++ bufsize = 1; ++ } ++ int r = __syscall(SYS_readlinkat, fd, path, buf, bufsize); ++ if (buf == dummy && r > 0) r = 0; ++ return __syscall_ret(r); + } diff --git a/srcpkgs/musl/patches/realpath.patch b/srcpkgs/musl/patches/realpath.patch new file mode 100644 index 000000000000..3d4bc9ae079d --- /dev/null +++ b/srcpkgs/musl/patches/realpath.patch @@ -0,0 +1,184 @@ +diff --git a/src/misc/realpath.c b/src/misc/realpath.c +index d2708e59..db8b74dc 100644 +--- a/src/misc/realpath.c ++++ b/src/misc/realpath.c +@@ -1,43 +1,156 @@ + #include + #include +-#include +-#include + #include + #include + #include +-#include "syscall.h" ++ ++static size_t slash_len(const char *s) ++{ ++ const char *s0 = s; ++ while (*s == '/') s++; ++ return s-s0; ++} + + char *realpath(const char *restrict filename, char *restrict resolved) + { +- int fd; +- ssize_t r; +- struct stat st1, st2; +- char buf[15+3*sizeof(int)]; +- char tmp[PATH_MAX]; ++ char stack[PATH_MAX+1]; ++ char output[PATH_MAX]; ++ size_t p, q, l, l0, cnt=0, nup=0; ++ int check_dir=0; + + if (!filename) { + errno = EINVAL; + return 0; + } ++ l = strnlen(filename, sizeof stack); ++ if (!l) { ++ errno = ENOENT; ++ return 0; ++ } ++ if (l >= PATH_MAX) goto toolong; ++ p = sizeof stack - l - 1; ++ q = 0; ++ memcpy(stack+p, filename, l+1); ++ ++ /* Main loop. Each iteration pops the next part from stack of ++ * remaining path components and consumes any slashes that follow. ++ * If not a link, it's moved to output; if a link, contents are ++ * pushed to the stack. */ ++restart: ++ for (; ; p+=slash_len(stack+p)) { ++ /* If stack starts with /, the whole component is / or // ++ * and the output state must be reset. */ ++ if (stack[p] == '/') { ++ check_dir=0; ++ nup=0; ++ q=0; ++ output[q++] = '/'; ++ p++; ++ /* Initial // is special. */ ++ if (stack[p] == '/' && stack[p+1] != '/') ++ output[q++] = '/'; ++ continue; ++ } ++ ++ char *z = __strchrnul(stack+p, '/'); ++ l0 = l = z-(stack+p); + +- fd = sys_open(filename, O_PATH|O_NONBLOCK|O_CLOEXEC); +- if (fd < 0) return 0; +- __procfdname(buf, fd); ++ if (!l && !check_dir) break; + +- r = readlink(buf, tmp, sizeof tmp - 1); +- if (r < 0) goto err; +- tmp[r] = 0; ++ /* Skip any . component but preserve check_dir status. */ ++ if (l==1 && stack[p]=='.') { ++ p += l; ++ continue; ++ } + +- fstat(fd, &st1); +- r = stat(tmp, &st2); +- if (r<0 || st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) { +- if (!r) errno = ELOOP; +- goto err; ++ /* Copy next component onto output at least temporarily, to ++ * call readlink, but wait to advance output position until ++ * determining it's not a link. */ ++ if (q && output[q-1] != '/') { ++ if (!p) goto toolong; ++ stack[--p] = '/'; ++ l++; ++ } ++ if (q+l >= PATH_MAX) goto toolong; ++ memcpy(output+q, stack+p, l); ++ output[q+l] = 0; ++ p += l; ++ ++ int up = 0; ++ if (l0==2 && stack[p-2]=='.' && stack[p-1]=='.') { ++ up = 1; ++ /* Any non-.. path components we could cancel start ++ * after nup repetitions of the 3-byte string "../"; ++ * if there are none, accumulate .. components to ++ * later apply to cwd, if needed. */ ++ if (q <= 3*nup) { ++ nup++; ++ q += l; ++ continue; ++ } ++ /* When previous components are already known to be ++ * directories, processing .. can skip readlink. */ ++ if (!check_dir) goto skip_readlink; ++ } ++ ssize_t k = readlink(output, stack, p); ++ if (k==p) goto toolong; ++ if (!k) { ++ errno = ENOENT; ++ return 0; ++ } ++ if (k<0) { ++ if (errno != EINVAL) return 0; ++skip_readlink: ++ check_dir = 0; ++ if (up) { ++ while(q && output[q-1]!='/') q--; ++ if (q>1 && (q>2 || output[0]!='/')) q--; ++ continue; ++ } ++ if (l0) q += l; ++ check_dir = stack[p]; ++ continue; ++ } ++ if (++cnt == SYMLOOP_MAX) { ++ errno = ELOOP; ++ return 0; ++ } ++ ++ /* If link contents end in /, strip any slashes already on ++ * stack to avoid /->// or //->/// or spurious toolong. */ ++ if (stack[k-1]=='/') while (stack[p]=='/') p++; ++ p -= k; ++ memmove(stack+p, stack, k); ++ ++ /* Skip the stack advancement in case we have a new ++ * absolute base path. */ ++ goto restart; + } + +- __syscall(SYS_close, fd); +- return resolved ? strcpy(resolved, tmp) : strdup(tmp); +-err: +- __syscall(SYS_close, fd); ++ output[q] = 0; ++ ++ if (output[0] != '/') { ++ if (!getcwd(stack, sizeof stack)) return 0; ++ l = strlen(stack); ++ /* Cancel any initial .. components. */ ++ p = 0; ++ while (nup--) { ++ while(l>1 && stack[l-1]!='/') l--; ++ if (l>1) l--; ++ p += 2; ++ if (p= PATH_MAX) goto toolong; ++ memmove(output + l, output + p, q - p + 1); ++ memcpy(output, stack, l); ++ q = l + q-p; ++ } ++ ++ if (resolved) return memcpy(resolved, output, q+1); ++ else return strdup(output); ++ ++toolong: ++ errno = ENAMETOOLONG; + return 0; + } diff --git a/srcpkgs/musl/template b/srcpkgs/musl/template index d30c99a563a0..a7379450902c 100644 --- a/srcpkgs/musl/template +++ b/srcpkgs/musl/template @@ -2,7 +2,7 @@ pkgname=musl reverts="1.2.0_1" version=1.1.24 -revision=9 +revision=10 archs="*-musl" bootstrap=yes build_style=gnu-configure @@ -10,8 +10,8 @@ configure_args="--prefix=/usr --disable-gcc-wrapper" short_desc="Musl C library" maintainer="Enno Boland " license="MIT" -homepage="http://www.musl-libc.org/" -distfiles="http://www.musl-libc.org/releases/musl-${version}.tar.gz" +homepage="https://musl.libc.org/" +distfiles="https://musl.libc.org/releases/musl-${version}.tar.gz" checksum=1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3 nostrip_files="libc.so" From 6bf39ead62cb40a4403640196bf5bd4807e4eb0e Mon Sep 17 00:00:00 2001 From: UsernameRandomlyGenerated Date: Sat, 5 Feb 2022 17:50:28 +0100 Subject: [PATCH 2/2] bubblewrap: update to 0.6.1. --- .../fix-TEMP_FAILTURE_RETRY-musl.patch | 19 -- .../patches/realpath-workaround.patch | 249 ------------------ srcpkgs/bubblewrap/template | 12 +- 3 files changed, 3 insertions(+), 277 deletions(-) delete mode 100644 srcpkgs/bubblewrap/patches/fix-TEMP_FAILTURE_RETRY-musl.patch delete mode 100644 srcpkgs/bubblewrap/patches/realpath-workaround.patch diff --git a/srcpkgs/bubblewrap/patches/fix-TEMP_FAILTURE_RETRY-musl.patch b/srcpkgs/bubblewrap/patches/fix-TEMP_FAILTURE_RETRY-musl.patch deleted file mode 100644 index 1afa9e4f9832..000000000000 --- a/srcpkgs/bubblewrap/patches/fix-TEMP_FAILTURE_RETRY-musl.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/bubblewrap.c -+++ b/bubblewrap.c -@@ -42,6 +42,16 @@ - #define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace */ - #endif - -+/* taken from glibc unistd.h and fixes musl */ -+#ifndef TEMP_FAILURE_RETRY -+#define TEMP_FAILURE_RETRY(expression) \ -+ (__extension__ \ -+ ({ long int __result; \ -+ do __result = (long int) (expression); \ -+ while (__result == -1L && errno == EINTR); \ -+ __result; })) -+#endif -+ - /* Globals to avoid having to use getuid(), since the uid/gid changes during runtime */ - static uid_t real_uid; - static gid_t real_gid; diff --git a/srcpkgs/bubblewrap/patches/realpath-workaround.patch b/srcpkgs/bubblewrap/patches/realpath-workaround.patch deleted file mode 100644 index 45d1fd6231b6..000000000000 --- a/srcpkgs/bubblewrap/patches/realpath-workaround.patch +++ /dev/null @@ -1,249 +0,0 @@ ---- /dev/null 2020-10-18 09:26:32.312745755 +0200 -+++ b/LICENSE.realpath 2020-10-18 11:09:14.119929076 +0200 -@@ -0,0 +1,29 @@ -+Copyright (c) 1989, 1991, 1993, 1995 -+ The Regents of the University of California. All rights reserved. -+ -+This code is derived from software contributed to Berkeley by -+Jan-Simon Pendry. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions -+are met: -+1. Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+2. Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+3. Neither the name of the University nor the names of its contributors -+ may be used to endorse or promote products derived from this software -+ without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+SUCH DAMAGE. ---- a/bind-mount.c 2018-09-26 14:55:17.000000000 +0200 -+++ b/bind-mount.c 2020-10-18 11:08:37.822931452 +0200 -@@ -22,6 +22,198 @@ - - #include "utils.h" - #include "bind-mount.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifndef __GLIBC__ -+/* -+ * Copyright (c) 1989, 1991, 1993, 1995 -+ * The Regents of the University of California. All rights reserved. -+ * -+ * This code is derived from software contributed to Berkeley by -+ * Jan-Simon Pendry. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. Neither the name of the University nor the names of its contributors -+ * may be used to endorse or promote products derived from this software -+ * without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+char *realpath_int(const char *, char*); -+char * -+realpath_int(const char * path, char * resolved) -+{ -+ struct stat sb; -+ int idx = 0, nlnk = 0; -+ const char *q; -+ char *p, wbuf[2][MAXPATHLEN], *fres; -+ size_t len; -+ ssize_t n; -+ -+ /* POSIX sez we must test for this */ -+ if (path == NULL) { -+ errno = EINVAL; -+ return NULL; -+ } -+ -+ if (resolved == NULL) { -+ fres = resolved = malloc(MAXPATHLEN); -+ if (resolved == NULL) -+ return NULL; -+ } else -+ fres = NULL; -+ -+ -+ /* -+ * Build real path one by one with paying an attention to ., -+ * .. and symbolic link. -+ */ -+ -+ /* -+ * `p' is where we'll put a new component with prepending -+ * a delimiter. -+ */ -+ p = resolved; -+ -+ if (*path == '\0') { -+ *p = '\0'; -+ errno = ENOENT; -+ goto out; -+ } -+ -+ /* If relative path, start from current working directory. */ -+ if (*path != '/') { -+ /* check for resolved pointer to appease coverity */ -+ if (resolved && getcwd(resolved, MAXPATHLEN) == NULL) { -+ p[0] = '.'; -+ p[1] = '\0'; -+ goto out; -+ } -+ len = strlen(resolved); -+ if (len > 1) -+ p += len; -+ } -+ -+loop: -+ /* Skip any slash. */ -+ while (*path == '/') -+ path++; -+ -+ if (*path == '\0') { -+ if (p == resolved) -+ *p++ = '/'; -+ *p = '\0'; -+ return resolved; -+ } -+ -+ /* Find the end of this component. */ -+ q = path; -+ do -+ q++; -+ while (*q != '/' && *q != '\0'); -+ -+ /* Test . or .. */ -+ if (path[0] == '.') { -+ if (q - path == 1) { -+ path = q; -+ goto loop; -+ } -+ if (path[1] == '.' && q - path == 2) { -+ /* Trim the last component. */ -+ if (p != resolved) -+ while (*--p != '/') -+ continue; -+ path = q; -+ goto loop; -+ } -+ } -+ -+ /* Append this component. */ -+ if (p - resolved + 1 + q - path + 1 > MAXPATHLEN) { -+ errno = ENAMETOOLONG; -+ if (p == resolved) -+ *p++ = '/'; -+ *p = '\0'; -+ goto out; -+ } -+ p[0] = '/'; -+ memcpy(&p[1], path, -+ /* LINTED We know q > path. */ -+ q - path); -+ p[1 + q - path] = '\0'; -+ -+ /* -+ * If this component is a symlink, toss it and prepend link -+ * target to unresolved path. -+ */ -+ if (lstat(resolved, &sb) == -1) -+ goto out; -+ -+ if (S_ISLNK(sb.st_mode)) { -+ if (nlnk++ >= MAXSYMLINKS) { -+ errno = ELOOP; -+ goto out; -+ } -+ n = readlink(resolved, wbuf[idx], sizeof(wbuf[0]) - 1); -+ if (n < 0) -+ goto out; -+ if (n == 0) { -+ errno = ENOENT; -+ goto out; -+ } -+ -+ /* Append unresolved path to link target and switch to it. */ -+ if (n + (len = strlen(q)) + 1 > sizeof(wbuf[0])) { -+ errno = ENAMETOOLONG; -+ goto out; -+ } -+ memcpy(&wbuf[idx][n], q, len + 1); -+ path = wbuf[idx]; -+ idx ^= 1; -+ -+ /* If absolute symlink, start from root. */ -+ if (*path == '/') -+ p = resolved; -+ goto loop; -+ } -+ if (*q == '/' && !S_ISDIR(sb.st_mode)) { -+ errno = ENOTDIR; -+ goto out; -+ } -+ -+ /* Advance both resolved and unresolved path. */ -+ p += 1 + q - path; -+ path = q; -+ goto loop; -+out: -+ free(fres); -+ return NULL; -+} -+#endif - - static char * - skip_token (char *line, bool eat_whitespace) -@@ -395,9 +587,14 @@ - - /* The mount operation will resolve any symlinks in the destination - path, so to find it in the mount table we need to do that too. */ -+#ifdef __GLIBC__ - resolved_dest = realpath (dest, NULL); -- if (resolved_dest == NULL) -+#else -+ resolved_dest = realpath_int (dest, NULL); -+#endif -+ if (resolved_dest == NULL) { - return 2; -+ } - - mount_tab = parse_mountinfo (proc_fd, resolved_dest); - if (mount_tab[0].mountpoint == NULL) diff --git a/srcpkgs/bubblewrap/template b/srcpkgs/bubblewrap/template index 4df1dac59395..eaede3a7178c 100644 --- a/srcpkgs/bubblewrap/template +++ b/srcpkgs/bubblewrap/template @@ -1,7 +1,7 @@ # Template file for 'bubblewrap' pkgname=bubblewrap -version=0.4.1 -revision=2 +version=0.6.1 +revision=1 build_style=gnu-configure hostmakedepends="libxslt docbook-xsl pkg-config" makedepends="libcap-devel" @@ -10,10 +10,4 @@ maintainer="Duncaen " license="LGPL-2.0-or-later" homepage="https://github.com/containers/bubblewrap" distfiles="${homepage}/releases/download/v${version}/${pkgname}-${version}.tar.xz" -checksum=b9c69b9b1c61a608f34325c8e1a495229bacf6e4a07cbb0c80cf7a814d7ccc03 - -post_install() { - if [ "$XBPS_TARGET_LIBC" = "musl" ]; then - vlicense LICENSE.realpath - fi -} +checksum=9609c7dc162bc68abc29abfab566934fdca37520a15ed01b675adcf3a4303282