diff options
Diffstat (limited to 'gnu/packages/patches')
30 files changed, 1875 insertions, 1533 deletions
diff --git a/gnu/packages/patches/arpack-ng-propagate-rng-state.patch b/gnu/packages/patches/arpack-ng-propagate-rng-state.patch new file mode 100644 index 0000000000..4466bb8e50 --- /dev/null +++ b/gnu/packages/patches/arpack-ng-propagate-rng-state.patch @@ -0,0 +1,523 @@ +Fix a bug that manifests while running the test suite of 'python-igraph': + + https://github.com/opencollab/arpack-ng/issues/401 + https://github.com/opencollab/arpack-ng/pull/414 + +From d885b7be4ecdc9c1496f2d6f256f6c0d34962459 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Szabolcs=20Horva=CC=81t?= <szhorvat@gmail.com> +Date: Sun, 9 Apr 2023 16:36:35 +0200 +Subject: [PATCH] fix: ensure that LAPACK RNG state is propagated + + - fixes #401, #410, #411 + - restores 'inits' variable removed in ce2e69a849da1d10dad5d6d3ec4db6120b3ecf50, ensuring that the RNG state is propagated + - reverts e0d67054f573da351f12a226f7c7cc65a690ef3d to ensure that seed is different on each parallel thread + - updates seed initialization of parallel pdgetv0/psgetv0 so that they match that of pzgetv0/pcgetv0 +--- + PARPACK/SRC/MPI/pcgetv0.f | 48 +++++++++++++++++++++++---------------- + PARPACK/SRC/MPI/pdgetv0.f | 40 ++++++++++++++++++++++++++------ + PARPACK/SRC/MPI/psgetv0.f | 43 ++++++++++++++++++++++++++--------- + PARPACK/SRC/MPI/pzgetv0.f | 48 +++++++++++++++++++++++---------------- + SRC/cgetv0.f | 21 ++++++++++++----- + SRC/dgetv0.f | 21 ++++++++++++----- + SRC/sgetv0.f | 21 ++++++++++++----- + SRC/zgetv0.f | 21 ++++++++++++----- + 8 files changed, 183 insertions(+), 80 deletions(-) + +diff --git a/PARPACK/SRC/MPI/pcgetv0.f b/PARPACK/SRC/MPI/pcgetv0.f +index 59e3d1658..24fe8a0f1 100644 +--- a/PARPACK/SRC/MPI/pcgetv0.f ++++ b/PARPACK/SRC/MPI/pcgetv0.f +@@ -176,13 +176,13 @@ subroutine pcgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj, myid, igen + Real + & rnorm0 + Complex + & cnorm, cnorm2 +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + Complex + & cnorm_buf, buf2(1) +@@ -203,6 +203,12 @@ subroutine pcgetv0 + & ccdotc + external ccdotc, pscnorm2, slapy2 + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -213,26 +219,30 @@ subroutine pcgetv0 + c | random number generator | + c %-----------------------------------% + c ++ if (inits) then + c +-c %-----------------------------------% +-c | Generate a seed on each processor | +-c | using process id (myid). | +-c | Note: the seed must be between 1 | +-c | and 4095. iseed(4) must be odd. | +-c %-----------------------------------% ++c %-----------------------------------% ++c | Generate a seed on each processor | ++c | using process id (myid). | ++c | Note: the seed must be between 1 | ++c | and 4095. iseed(4) must be odd. | ++c %-----------------------------------% + c +- call MPI_COMM_RANK(comm, myid, ierr) +- igen = 1000 + 2*myid + 1 +- if (igen .gt. 4095) then +- write(0,*) 'Error in p_getv0: seed exceeds 4095!' +- end if ++ call MPI_COMM_RANK(comm, myid, ierr) ++ igen = 1000 + 2*myid + 1 ++ if (igen .gt. 4095) then ++ write(0,*) 'Error in p_getv0: seed exceeds 4095!' ++ end if ++c ++ iseed(1) = igen/1000 ++ igen = mod(igen,1000) ++ iseed(2) = igen/100 ++ igen = mod(igen,100) ++ iseed(3) = igen/10 ++ iseed(4) = mod(igen,10) + c +- iseed(1) = igen/1000 +- igen = mod(igen,1000) +- iseed(2) = igen/100 +- igen = mod(igen,100) +- iseed(3) = igen/10 +- iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/PARPACK/SRC/MPI/pdgetv0.f b/PARPACK/SRC/MPI/pdgetv0.f +index 0f348b820..5a1956997 100644 +--- a/PARPACK/SRC/MPI/pdgetv0.f ++++ b/PARPACK/SRC/MPI/pdgetv0.f +@@ -177,11 +177,11 @@ subroutine pdgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth +- integer idist, iseed(4), iter, msglvl, jj ++ logical first, inits, orth ++ integer idist, iseed(4), iter, msglvl, jj, myid, igen + Double precision + & rnorm0, buf2(1) +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + Double precision + & rnorm_buf +@@ -206,6 +206,12 @@ subroutine pdgetv0 + c + intrinsic abs, sqrt + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -216,10 +222,30 @@ subroutine pdgetv0 + c | random number generator | + c %-----------------------------------% + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++ if (inits) then ++c ++c %-----------------------------------% ++c | Generate a seed on each processor | ++c | using process id (myid). | ++c | Note: the seed must be between 1 | ++c | and 4095. iseed(4) must be odd. | ++c %-----------------------------------% ++c ++ call MPI_COMM_RANK(comm, myid, ierr) ++ igen = 1000 + 2*myid + 1 ++ if (igen .gt. 4095) then ++ write(0,*) 'Error in p_getv0: seed exceeds 4095!' ++ end if ++c ++ iseed(1) = igen/1000 ++ igen = mod(igen,1000) ++ iseed(2) = igen/100 ++ igen = mod(igen,100) ++ iseed(3) = igen/10 ++ iseed(4) = mod(igen,10) ++c ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/PARPACK/SRC/MPI/psgetv0.f b/PARPACK/SRC/MPI/psgetv0.f +index d79a513b2..078e4fa8c 100644 +--- a/PARPACK/SRC/MPI/psgetv0.f ++++ b/PARPACK/SRC/MPI/psgetv0.f +@@ -177,11 +177,11 @@ subroutine psgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth +- integer idist, iseed(4), iter, msglvl, jj ++ logical first, inits, orth ++ integer idist, iseed(4), iter, msglvl, jj, myid, igen + Real + & rnorm0 +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + Real + & rnorm_buf +@@ -206,20 +206,41 @@ subroutine psgetv0 + c + intrinsic abs, sqrt + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% + c + c +-c %-----------------------------------% +-c | Initialize the seed of the LAPACK | +-c | random number generator | +-c %-----------------------------------% ++ if (inits) then + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++c %-----------------------------------% ++c | Generate a seed on each processor | ++c | using process id (myid). | ++c | Note: the seed must be between 1 | ++c | and 4095. iseed(4) must be odd. | ++c %-----------------------------------% ++c ++ call MPI_COMM_RANK(comm, myid, ierr) ++ igen = 1000 + 2*myid + 1 ++ if (igen .gt. 4095) then ++ write(0,*) 'Error in p_getv0: seed exceeds 4095!' ++ end if ++c ++ iseed(1) = igen/1000 ++ igen = mod(igen,1000) ++ iseed(2) = igen/100 ++ igen = mod(igen,100) ++ iseed(3) = igen/10 ++ iseed(4) = mod(igen,10) ++c ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/PARPACK/SRC/MPI/pzgetv0.f b/PARPACK/SRC/MPI/pzgetv0.f +index 731fb319f..94fb705f3 100644 +--- a/PARPACK/SRC/MPI/pzgetv0.f ++++ b/PARPACK/SRC/MPI/pzgetv0.f +@@ -176,13 +176,13 @@ subroutine pzgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj, myid, igen + Double precision + & rnorm0 + Complex*16 + & cnorm, cnorm2 +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + Complex*16 + & cnorm_buf, buf2(1) +@@ -203,6 +203,12 @@ subroutine pzgetv0 + & zzdotc + external zzdotc , pdznorm2 , dlapy2 + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -213,26 +219,30 @@ subroutine pzgetv0 + c | random number generator | + c %-----------------------------------% + c ++ if (inits) then + c +-c %-----------------------------------% +-c | Generate a seed on each processor | +-c | using process id (myid). | +-c | Note: the seed must be between 1 | +-c | and 4095. iseed(4) must be odd. | +-c %-----------------------------------% ++c %-----------------------------------% ++c | Generate a seed on each processor | ++c | using process id (myid). | ++c | Note: the seed must be between 1 | ++c | and 4095. iseed(4) must be odd. | ++c %-----------------------------------% + c +- call MPI_COMM_RANK(comm, myid, ierr) +- igen = 1000 + 2*myid + 1 +- if (igen .gt. 4095) then +- write(0,*) 'Error in p_getv0: seed exceeds 4095!' +- end if ++ call MPI_COMM_RANK(comm, myid, ierr) ++ igen = 1000 + 2*myid + 1 ++ if (igen .gt. 4095) then ++ write(0,*) 'Error in p_getv0: seed exceeds 4095!' ++ end if ++c ++ iseed(1) = igen/1000 ++ igen = mod(igen,1000) ++ iseed(2) = igen/100 ++ igen = mod(igen,100) ++ iseed(3) = igen/10 ++ iseed(4) = mod(igen,10) + c +- iseed(1) = igen/1000 +- igen = mod(igen,1000) +- iseed(2) = igen/100 +- igen = mod(igen,100) +- iseed(3) = igen/10 +- iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/SRC/cgetv0.f b/SRC/cgetv0.f +index b49e66708..c231eadcb 100644 +--- a/SRC/cgetv0.f ++++ b/SRC/cgetv0.f +@@ -156,13 +156,13 @@ subroutine cgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj + Real + & rnorm0 + Complex + & cnorm +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + c %----------------------% + c | External Subroutines | +@@ -180,6 +180,12 @@ subroutine cgetv0 + & ccdotc + external ccdotc, scnrm2, slapy2 + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -190,10 +196,13 @@ subroutine cgetv0 + c | random number generator | + c %-----------------------------------% + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++ if (inits) then ++ iseed(1) = 1 ++ iseed(2) = 3 ++ iseed(3) = 5 ++ iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/SRC/dgetv0.f b/SRC/dgetv0.f +index 8be4fa26d..1d6dc01bd 100644 +--- a/SRC/dgetv0.f ++++ b/SRC/dgetv0.f +@@ -157,11 +157,11 @@ subroutine dgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj + Double precision + & rnorm0 +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + c %----------------------% + c | External Subroutines | +@@ -183,6 +183,12 @@ subroutine dgetv0 + c + intrinsic abs, sqrt + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -193,10 +199,13 @@ subroutine dgetv0 + c | random number generator | + c %-----------------------------------% + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++ if (inits) then ++ iseed(1) = 1 ++ iseed(2) = 3 ++ iseed(3) = 5 ++ iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/SRC/sgetv0.f b/SRC/sgetv0.f +index 26130a014..d861b2d6d 100644 +--- a/SRC/sgetv0.f ++++ b/SRC/sgetv0.f +@@ -157,11 +157,11 @@ subroutine sgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj + Real + & rnorm0 +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + c %----------------------% + c | External Subroutines | +@@ -183,6 +183,12 @@ subroutine sgetv0 + c + intrinsic abs, sqrt + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -193,10 +199,13 @@ subroutine sgetv0 + c | random number generator | + c %-----------------------------------% + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++ if (inits) then ++ iseed(1) = 1 ++ iseed(2) = 3 ++ iseed(3) = 5 ++ iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c +diff --git a/SRC/zgetv0.f b/SRC/zgetv0.f +index cc13c3cfb..1fbd50851 100644 +--- a/SRC/zgetv0.f ++++ b/SRC/zgetv0.f +@@ -156,13 +156,13 @@ subroutine zgetv0 + c | Local Scalars & Arrays | + c %------------------------% + c +- logical first, orth ++ logical first, inits, orth + integer idist, iseed(4), iter, msglvl, jj + Double precision + & rnorm0 + Complex*16 + & cnorm +- save first, iseed, iter, msglvl, orth, rnorm0 ++ save first, iseed, inits, iter, msglvl, orth, rnorm0 + c + c %----------------------% + c | External Subroutines | +@@ -180,6 +180,12 @@ subroutine zgetv0 + & zzdotc + external zzdotc, dznrm2, dlapy2 + c ++c %-----------------% ++c | Data Statements | ++c %-----------------% ++c ++ data inits /.true./ ++c + c %-----------------------% + c | Executable Statements | + c %-----------------------% +@@ -190,10 +196,13 @@ subroutine zgetv0 + c | random number generator | + c %-----------------------------------% + c +- iseed(1) = 1 +- iseed(2) = 3 +- iseed(3) = 5 +- iseed(4) = 7 ++ if (inits) then ++ iseed(1) = 1 ++ iseed(2) = 3 ++ iseed(3) = 5 ++ iseed(4) = 7 ++ inits = .false. ++ end if + c + if (ido .eq. 0) then + c diff --git a/gnu/packages/patches/biber-adapt-perl-5.36.patch b/gnu/packages/patches/biber-adapt-perl-5.36.patch deleted file mode 100644 index 895813c1f2..0000000000 --- a/gnu/packages/patches/biber-adapt-perl-5.36.patch +++ /dev/null @@ -1,40 +0,0 @@ -From d9e961710074d266ad6bdf395c98868d91952088 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com> -Date: Wed, 25 May 2022 12:41:59 +0200 -Subject: [PATCH] Adapt to Perl 5.36 - -A developmental release of Perl 5.36.0 fails to run tests with: - - $ perl -Ilib t/basic-misc.t - 1..72 - Can't modify undef operator in scalar assignment at lib/Biber/Section.pm line 433, near "undef;" - Compilation failed in require at lib/Biber.pm line 24. - BEGIN failed--compilation aborted at lib/Biber.pm line 24. - Compilation failed in require at t/basic-misc.t line 11. - BEGIN failed--compilation aborted at t/basic-misc.t line 11. - # Looks like your test exited with 255 before it could output anything. - -This is because of a missing semicolon between commands in -del_everykeys(). The new perl is more strict and raises a compile-time -error: - - $ perl -e '$a = undef $b = undef;' - Can't modify undef operator in scalar assignment at -e line 1, near "undef;" - Execution of -e aborted due to compilation errors. ---- - lib/Biber/Section.pm | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/Biber/Section.pm b/lib/Biber/Section.pm -index 03ed69a51..a78942f57 100644 ---- a/lib/Biber/Section.pm -+++ b/lib/Biber/Section.pm -@@ -429,7 +429,7 @@ sub add_everykey { - - sub del_everykeys { - my $self = shift; -- $self->{everykey} = undef -+ $self->{everykey} = undef; - $self->{everykey_lc} = undef; - return; - } diff --git a/gnu/packages/patches/doxygen-hurd.patch b/gnu/packages/patches/doxygen-hurd.patch new file mode 100644 index 0000000000..a40923184b --- /dev/null +++ b/gnu/packages/patches/doxygen-hurd.patch @@ -0,0 +1,30 @@ +Upstream status: Adapted from upstream. + +From d3d968e5835f449d7ea715f45160db81ea906303 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Tue, 16 Aug 2022 20:29:54 +0200 +Subject: [PATCH] Fix build on GNU/Hurd + +There is no path length limitation there, even via pathconf. But glibc +provides a getcwd function that allocates the buffer dynamically so we can +just leverage that. +--- + include/ghc/filesystem.hpp | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/filesystem/filesystem.hpp.orig 2022-08-11 22:14:32.000000000 +0200 ++++ b/filesystem/filesystem.hpp 2023-06-13 07:26:25.310000000 +0200 +@@ -4081,6 +4081,13 @@ + return path(); + } + return path(std::wstring(buffer.get()), path::native_format); ++#elif defined(__GLIBC__) ++ std::unique_ptr<char, decltype(&std::free)> buffer { ::getcwd(NULL, 0), std::free }; ++ if (buffer == nullptr) { ++ ec = detail::make_system_error(); ++ return path(); ++ } ++ return path(buffer.get()); + #else + size_t pathlen = static_cast<size_t>(std::max(int(::pathconf(".", _PC_PATH_MAX)), int(PATH_MAX))); + std::unique_ptr<char[]> buffer(new char[pathlen + 1]); diff --git a/gnu/packages/patches/fontforge-hurd.patch b/gnu/packages/patches/fontforge-hurd.patch new file mode 100644 index 0000000000..20d62b8ce2 --- /dev/null +++ b/gnu/packages/patches/fontforge-hurd.patch @@ -0,0 +1,82 @@ +Upstream status: Taken from upstream. + +From dca87c025665f0f010f906a4eba96da9794a4d04 Mon Sep 17 00:00:00 2001 +From: Anthony Fok <foka@debian.org> +Date: Thu, 16 Jun 2022 02:40:23 -0600 +Subject: [PATCH] Define PATH_MAX and MAXPATHLEN for GNU/Hurd compatibility + +Special thanks to @henrich, @ucko and @kilobyte for reporting the issue +and offering suggestions on a fix. + +See also https://bugs.debian.org/877795 + +Fixes #3119 +--- + inc/basics.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/inc/basics.h b/inc/basics.h +index b8d65823b..14590c5b1 100644 +--- a/inc/basics.h ++++ b/inc/basics.h +@@ -123,5 +123,13 @@ static inline int imax(int a, int b) + last = newitem; \ + } + ++#ifdef __GNU__ ++# ifndef PATH_MAX ++# define PATH_MAX 4096 ++# endif ++# ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++# endif ++#endif + + #endif /* FONTFORGE_BASICS_H */ +-- +2.40.1 + +From e0480f143f27f8f2686b5b14d7d302fe22f35002 Mon Sep 17 00:00:00 2001 +From: Anthony Fok <foka@debian.org> +Date: Thu, 16 Jun 2022 03:06:56 -0600 +Subject: [PATCH] Undefine "extended" macro temporarily on GNU Hurd + +GNU Mach microkernel header files (gnumach-dev 1.8+git20201129) added to +struct i386_xfp_save in /usr/include/i386-gnu/include/mach/i386/fp_reg.h +a new "extended" field which happens to collide with the macro definition +"#define extended double" in FontForge, leading to FTBFS on GNU Hurd. + +This issue may be circumvented by temporarily undefining the "extended" +macro before loading `<gio/gio.h>` and friends, and redefining the +"extended" macro right after. +--- + inc/ffglib.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/inc/ffglib.h b/inc/ffglib.h +index f3419f0ab..25fe9ebde 100644 +--- a/inc/ffglib.h ++++ b/inc/ffglib.h +@@ -26,11 +26,19 @@ + #define GMenuItem GMenuItem_GIO + #define GTimer GTimer_GTK + ++#ifdef __GNU__ ++# undef extended ++#endif ++ + #include <gio/gio.h> + #include <glib-object.h> + #include <glib.h> + #include <glib/gstdio.h> + ++#ifdef __GNU__ ++# define extended double ++#endif ++ + #undef GList + #undef GMenuItem + #undef GTimer +-- +2.40.1 + diff --git a/gnu/packages/patches/ghostscript-CVE-2023-36664-fixup.patch b/gnu/packages/patches/ghostscript-CVE-2023-36664-fixup.patch new file mode 100644 index 0000000000..c2a222701f --- /dev/null +++ b/gnu/packages/patches/ghostscript-CVE-2023-36664-fixup.patch @@ -0,0 +1,56 @@ +From 0974e4f2ac0005d3731e0b5c13ebc7e965540f4d Mon Sep 17 00:00:00 2001 +From: Chris Liddell <chris.liddell@artifex.com> +Date: Wed, 14 Jun 2023 09:08:12 +0100 +Subject: [PATCH] Bug 706778: 706761 revisit + +Two problems with the original commit. The first a silly typo inverting the +logic of a test. + +The second was forgetting that we actually actually validate two candidate +strings for pipe devices. One with the expected "%pipe%" prefix, the other +using the pipe character prefix: "|". + +This addresses both those. +--- + base/gpmisc.c | 2 +- + base/gslibctx.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/base/gpmisc.c b/base/gpmisc.c +index 58511270e..2b0064bea 100644 +--- a/base/gpmisc.c ++++ b/base/gpmisc.c +@@ -1081,7 +1081,7 @@ gp_validate_path_len(const gs_memory_t *mem, + /* "%pipe%" do not follow the normal rules for path definitions, so we + don't "reduce" them to avoid unexpected results + */ +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { + bufferfull = buffer = (char *)gs_alloc_bytes(mem->thread_safe_memory, len + 1, "gp_validate_path"); + if (buffer == NULL) + return gs_error_VMerror; +diff --git a/base/gslibctx.c b/base/gslibctx.c +index d2a1aa91d..42af99090 100644 +--- a/base/gslibctx.c ++++ b/base/gslibctx.c +@@ -743,7 +743,7 @@ gs_add_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, co + /* "%pipe%" do not follow the normal rules for path definitions, so we + don't "reduce" them to avoid unexpected results + */ +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { + buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_add_control_path_len"); + if (buffer == NULL) + return gs_error_VMerror; +@@ -850,7 +850,7 @@ gs_remove_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, + /* "%pipe%" do not follow the normal rules for path definitions, so we + don't "reduce" them to avoid unexpected results + */ +- if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ if (path[0] == '|' || (len > 5 && memcmp(path, "%pipe", 5) == 0)) { + buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_remove_control_path_len"); + if (buffer == NULL) + return gs_error_VMerror; +-- +2.34.1 + diff --git a/gnu/packages/patches/ghostscript-CVE-2023-36664.patch b/gnu/packages/patches/ghostscript-CVE-2023-36664.patch new file mode 100644 index 0000000000..e9c53c1f87 --- /dev/null +++ b/gnu/packages/patches/ghostscript-CVE-2023-36664.patch @@ -0,0 +1,142 @@ +From 505eab7782b429017eb434b2b95120855f2b0e3c Mon Sep 17 00:00:00 2001 +From: Chris Liddell <chris.liddell@artifex.com> +Date: Wed, 7 Jun 2023 10:23:06 +0100 +Subject: [PATCH] Bug 706761: Don't "reduce" %pipe% file names for permission + validation + +For regular file names, we try to simplfy relative paths before we use them. + +Because the %pipe% device can, effectively, accept command line calls, we +shouldn't be simplifying that string, because the command line syntax can end +up confusing the path simplifying code. That can result in permitting a pipe +command which does not match what was originally permitted. + +Special case "%pipe" in the validation code so we always deal with the entire +string. +--- + base/gpmisc.c | 31 +++++++++++++++++++-------- + base/gslibctx.c | 56 ++++++++++++++++++++++++++++++++++++------------- + 2 files changed, 64 insertions(+), 23 deletions(-) + +diff --git a/base/gpmisc.c b/base/gpmisc.c +index 5f39ebba7..2fb87f769 100644 +--- a/base/gpmisc.c ++++ b/base/gpmisc.c +@@ -1076,16 +1076,29 @@ gp_validate_path_len(const gs_memory_t *mem, + && !memcmp(path + cdirstrl, dirsepstr, dirsepstrl)) { + prefix_len = 0; + } +- rlen = len+1; +- bufferfull = (char *)gs_alloc_bytes(mem->thread_safe_memory, rlen + prefix_len, "gp_validate_path"); +- if (bufferfull == NULL) +- return gs_error_VMerror; +- +- buffer = bufferfull + prefix_len; +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) +- return gs_error_invalidfileaccess; +- buffer[rlen] = 0; + ++ /* "%pipe%" do not follow the normal rules for path definitions, so we ++ don't "reduce" them to avoid unexpected results ++ */ ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ bufferfull = buffer = (char *)gs_alloc_bytes(mem->thread_safe_memory, len + 1, "gp_validate_path"); ++ if (buffer == NULL) ++ return gs_error_VMerror; ++ memcpy(buffer, path, len); ++ buffer[len] = 0; ++ rlen = len; ++ } ++ else { ++ rlen = len+1; ++ bufferfull = (char *)gs_alloc_bytes(mem->thread_safe_memory, rlen + prefix_len, "gp_validate_path"); ++ if (bufferfull == NULL) ++ return gs_error_VMerror; ++ ++ buffer = bufferfull + prefix_len; ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) ++ return gs_error_invalidfileaccess; ++ buffer[rlen] = 0; ++ } + while (1) { + switch (mode[0]) + { +diff --git a/base/gslibctx.c b/base/gslibctx.c +index eb566ed06..d2a1aa91d 100644 +--- a/base/gslibctx.c ++++ b/base/gslibctx.c +@@ -740,14 +740,28 @@ gs_add_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, co + return gs_error_rangecheck; + } + +- rlen = len+1; +- buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gp_validate_path"); +- if (buffer == NULL) +- return gs_error_VMerror; ++ /* "%pipe%" do not follow the normal rules for path definitions, so we ++ don't "reduce" them to avoid unexpected results ++ */ ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_add_control_path_len"); ++ if (buffer == NULL) ++ return gs_error_VMerror; ++ memcpy(buffer, path, len); ++ buffer[len] = 0; ++ rlen = len; ++ } ++ else { ++ rlen = len + 1; + +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) +- return gs_error_invalidfileaccess; +- buffer[rlen] = 0; ++ buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gs_add_control_path_len"); ++ if (buffer == NULL) ++ return gs_error_VMerror; ++ ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) ++ return gs_error_invalidfileaccess; ++ buffer[rlen] = 0; ++ } + + n = control->num; + for (i = 0; i < n; i++) +@@ -833,14 +847,28 @@ gs_remove_control_path_len_flags(const gs_memory_t *mem, gs_path_control_t type, + return gs_error_rangecheck; + } + +- rlen = len+1; +- buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gp_validate_path"); +- if (buffer == NULL) +- return gs_error_VMerror; ++ /* "%pipe%" do not follow the normal rules for path definitions, so we ++ don't "reduce" them to avoid unexpected results ++ */ ++ if (len > 5 && memcmp(path, "%pipe", 5) != 0) { ++ buffer = (char *)gs_alloc_bytes(core->memory, len + 1, "gs_remove_control_path_len"); ++ if (buffer == NULL) ++ return gs_error_VMerror; ++ memcpy(buffer, path, len); ++ buffer[len] = 0; ++ rlen = len; ++ } ++ else { ++ rlen = len+1; + +- if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) +- return gs_error_invalidfileaccess; +- buffer[rlen] = 0; ++ buffer = (char *)gs_alloc_bytes(core->memory, rlen, "gs_remove_control_path_len"); ++ if (buffer == NULL) ++ return gs_error_VMerror; ++ ++ if (gp_file_name_reduce(path, (uint)len, buffer, &rlen) != gp_combine_success) ++ return gs_error_invalidfileaccess; ++ buffer[rlen] = 0; ++ } + + n = control->num; + for (i = 0; i < n; i++) { +-- +2.34.1 + diff --git a/gnu/packages/patches/ghostscript-leptonica-hurd.patch b/gnu/packages/patches/ghostscript-leptonica-hurd.patch new file mode 100644 index 0000000000..124365b3e6 --- /dev/null +++ b/gnu/packages/patches/ghostscript-leptonica-hurd.patch @@ -0,0 +1,78 @@ +Upstream status: This patch was taken from leptonica upstream. + +Backported to ghostscripts bundled leptonica. + +From f04da7c816feb1d5f689c34f3d0e7e3621edf1f5 Mon Sep 17 00:00:00 2001 +From: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Wed, 1 Feb 2023 19:35:43 +0100 +Subject: [PATCH] Fix GNU/Hurd build + +There is no PATH_MAX limitation on GNU/Hurd, and realpath() can be +safely be used with its second parameter set to NULL (as required by +posix since its version 2001). +--- + src/sarray1.c | 29 +++++++++++++++++++++++------ + 1 file changed, 23 insertions(+), 6 deletions(-) + +--- a/src/sarray1.c 2023-06-13 12:31:13.393672916 +0200 ++++ a/src/sarray1.c 2023-06-13 12:34:13.574237149 +0200 +@@ -1953,7 +1953,11 @@ + SARRAY * + getFilenamesInDirectory(const char *dirname) + { ++#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) ++char *dir; ++#else + char dir[PATH_MAX + 1]; ++#endif + char *realdir, *stat_path, *ignore; + size_t size; + SARRAY *safiles; +@@ -1976,17 +1980,28 @@ + * If the file or directory exists, realpath returns its path; + else it returns NULL. + * If the second arg to realpath is passed in, the canonical path +- is returned there. Use a buffer of sufficient size. If the +- second arg is NULL, the path is malloc'd and returned if the +- file or directory exists. +- We pass in a buffer for the second arg, and check that the canonical +- directory path was made. The existence of the directory is checked +- later, after its actual path is returned by genPathname(). */ ++ is returned there. Use a buffer of sufficient size. ++ We pass in a buffer for the second arg, and check that the ++ canonical directory path was made. The existence of the ++ directory is checked later, after its actual path is returned by ++ genPathname(). ++ With GNU libc or Posix 2001, if the second arg is NULL, the path ++ is malloc'd and returned if the file or directory exists. ++ */ ++#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) ++ dir = realpath(dirname, NULL); ++ if (dir == NULL) ++ return (SARRAY *)ERROR_PTR("dir not made", __func__, NULL); ++#else + dir[0] = '\0'; /* init empty in case realpath() fails to write it */ + ignore = realpath(dirname, dir); + if (dir[0] == '\0') + return (SARRAY *)ERROR_PTR("dir not made", procName, NULL); ++#endif + realdir = genPathname(dir, NULL); ++#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) ++ LEPT_FREE(dir); ++#endif + if ((pdir = opendir(realdir)) == NULL) { + LEPT_FREE(realdir); + return (SARRAY *)ERROR_PTR("pdir not opened", procName, NULL); +@@ -1998,10 +2013,12 @@ + stat_ret = fstatat(dfd, pdirentry->d_name, &st, 0); + #else + size = strlen(realdir) + strlen(pdirentry->d_name) + 2; ++#if _POSIX_VERSION < 200112 && !defined(__GLIBC__) + if (size > PATH_MAX) { + L_ERROR("size = %zu too large; skipping\n", procName, size); + continue; + } ++#endif + stat_path = (char *)LEPT_CALLOC(size, 1); + snprintf(stat_path, size, "%s/%s", realdir, pdirentry->d_name); + stat_ret = stat(stat_path, &st); diff --git a/gnu/packages/patches/glibc-2.37-hurd-clock_t_centiseconds.patch b/gnu/packages/patches/glibc-2.37-hurd-clock_t_centiseconds.patch new file mode 100644 index 0000000000..944b2fe8df --- /dev/null +++ b/gnu/packages/patches/glibc-2.37-hurd-clock_t_centiseconds.patch @@ -0,0 +1,61 @@ +Taken from: https://salsa.debian.org/glibc-team/glibc/-/blob/9ce19663f00176f30d6eab29fd14db3e7cd53dcf/debian/patches/hurd-i386/unsubmitted-clock_t_centiseconds.diff + +Some applications assume centisecond precision, or at most millisecond precision +(e.g. guile). This is a work-around for them. + +--- + getclktck.c | 5 ++--- + setitimer.c | 2 +- + times.c | 2 +- + 4 files changed, 8 insertions(+), 9 deletions(-) +commit d57f2f9b4bd007846af2fb4217486ea572579010 +Author: Richard Braun <rbraun@sceen.net> +Date: Tue Aug 27 11:35:31 2013 +0200 + + Express CPU time (clock_t of times(2)) in centiseconds + +diff --git a/sysdeps/mach/hurd/getclktck.c b/sysdeps/mach/hurd/getclktck.c +index 69be2cc..5f7d946 100644 +--- a/sysdeps/mach/hurd/getclktck.c ++++ b/sysdeps/mach/hurd/getclktck.c +@@ -18,12 +18,11 @@ + + #include <time.h> + +-/* Return frequency of `times'. +- Since Mach reports CPU times in microseconds, we always use 1 million. */ ++/* Return frequency of `times'. */ + int + __getclktck (void) + { +- return 1000000; ++ return 100; + } + + /* Before glibc 2.2, the Hurd actually did this differently, so we +diff --git a/sysdeps/mach/hurd/setitimer.c b/sysdeps/mach/hurd/setitimer.c +index 39b6b16..4992c89 100644 +--- a/sysdeps/mach/hurd/setitimer.c ++++ b/sysdeps/mach/hurd/setitimer.c +@@ -42,7 +42,7 @@ quantize_timeval (struct timeval *tv) + static time_t quantum = -1; + + if (quantum == -1) +- quantum = 1000000 / __getclktck (); ++ quantum = 100 / __getclktck (); + + tv->tv_usec = ((tv->tv_usec + (quantum - 1)) / quantum) * quantum; + if (tv->tv_usec >= 1000000) +diff --git a/sysdeps/mach/hurd/times.c b/sysdeps/mach/hurd/times.c +index 9e13a75..593c33a 100644 +--- a/sysdeps/mach/hurd/times.c ++++ b/sysdeps/mach/hurd/times.c +@@ -29,7 +29,7 @@ + static inline clock_t + clock_from_time_value (const time_value_t *t) + { +- return t->seconds * 1000000 + t->microseconds; ++ return t->seconds * 100 + t->microseconds / 10000; + } + + /* Store the CPU time used by this process and all its diff --git a/gnu/packages/patches/glibc-2.37-hurd-local-clock_gettime_MONOTONIC.patch b/gnu/packages/patches/glibc-2.37-hurd-local-clock_gettime_MONOTONIC.patch new file mode 100644 index 0000000000..63e06b8519 --- /dev/null +++ b/gnu/packages/patches/glibc-2.37-hurd-local-clock_gettime_MONOTONIC.patch @@ -0,0 +1,135 @@ +Taken from: https://salsa.debian.org/glibc-team/glibc/-/blob/9ce19663f00176f30d6eab29fd14db3e7cd53dcf/debian/patches/hurd-i386/local-clock_gettime_MONOTONIC.diff + +Use the realtime clock for the monotonic clock. This is of course not a proper +implementation (which is being done in Mach), but will permit to fix at least +the iceweasel stack. + +vlc however doesn't build when _POSIX_CLOCK_SELECTION is enabled but +_POSIX_TIMERS is not, and they refuse to fix that (see #765578), so disable the +former. + +--- + sysdeps/mach/hurd/bits/posix_opt.h | 2 +- + sysdeps/unix/clock_gettime.c | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) +Index: glibc-2.27/sysdeps/mach/clock_gettime.c +=================================================================== +--- glibc-2.27.orig/sysdeps/mach/clock_gettime.c ++++ glibc-2.27/sysdeps/mach/clock_gettime.c +@@ -31,6 +31,10 @@ __clock_gettime (clockid_t clock_id, str + switch (clock_id) { + + case CLOCK_REALTIME: ++ case CLOCK_MONOTONIC: ++ case CLOCK_MONOTONIC_RAW: ++ case CLOCK_REALTIME_COARSE: ++ case CLOCK_MONOTONIC_COARSE: + { + /* __host_get_time can only fail if passed an invalid host_t. + __mach_host_self could theoretically fail (producing an +Index: glibc-2.27/rt/timer_create.c +=================================================================== +--- glibc-2.27.orig/rt/timer_create.c ++++ glibc-2.27/rt/timer_create.c +@@ -48,7 +48,7 @@ timer_create (clockid_t clock_id, struct + return -1; + } + +- if (clock_id != CLOCK_REALTIME) ++ if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_MONOTONIC_RAW && clock_id != CLOCK_REALTIME_COARSE && clock_id != CLOCK_MONOTONIC_COARSE) + { + __set_errno (EINVAL); + return -1; +Index: glibc-2.27/sysdeps/mach/hurd/bits/posix_opt.h +=================================================================== +--- glibc-2.27.orig/sysdeps/mach/hurd/bits/posix_opt.h ++++ glibc-2.27/sysdeps/mach/hurd/bits/posix_opt.h +@@ -163,10 +163,10 @@ + #define _POSIX_THREAD_PROCESS_SHARED -1 + + /* The monotonic clock might be available. */ +-#define _POSIX_MONOTONIC_CLOCK 0 ++#define _POSIX_MONOTONIC_CLOCK 200809L + +-/* The clock selection interfaces are available. */ +-#define _POSIX_CLOCK_SELECTION 200809L ++/* The clock selection interfaces are not really available yet. */ ++#define _POSIX_CLOCK_SELECTION -1 + + /* Advisory information interfaces could be available in future. */ + #define _POSIX_ADVISORY_INFO 0 +Index: glibc-upstream/sysdeps/posix/clock_getres.c +=================================================================== +--- glibc-upstream.orig/sysdeps/posix/clock_getres.c ++++ glibc-upstream/sysdeps/posix/clock_getres.c +@@ -52,6 +52,10 @@ __clock_getres (clockid_t clock_id, stru + switch (clock_id) + { + case CLOCK_REALTIME: ++ case CLOCK_MONOTONIC: ++ case CLOCK_MONOTONIC_RAW: ++ case CLOCK_REALTIME_COARSE: ++ case CLOCK_MONOTONIC_COARSE: + retval = realtime_getres (res); + break; + +--- ./sysdeps/mach/clock_nanosleep.c.original 2020-07-21 00:31:35.226113142 +0200 ++++ ./sysdeps/mach/clock_nanosleep.c 2020-07-21 00:31:49.026185761 +0200 +@@ -62,7 +62,7 @@ + __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, + struct timespec *rem) + { +- if (clock_id != CLOCK_REALTIME ++ if ((clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC && clock_id != CLOCK_MONOTONIC_RAW && clock_id != CLOCK_REALTIME_COARSE && clock_id != CLOCK_MONOTONIC_COARSE) + || !valid_nanoseconds (req->tv_nsec) + || (flags != 0 && flags != TIMER_ABSTIME)) + return EINVAL; +Index: glibc-2.32/hurd/hurdlock.c +=================================================================== +--- glibc-2.32.orig/hurd/hurdlock.c ++++ glibc-2.32/hurd/hurdlock.c +@@ -47,7 +47,7 @@ int + __lll_abstimed_wait (void *ptr, int val, + const struct timespec *tsp, int flags, int clk) + { +- if (clk != CLOCK_REALTIME) ++ if (clk != CLOCK_REALTIME && clk != CLOCK_MONOTONIC) + return EINVAL; + + int mlsec = compute_reltime (tsp, clk); +@@ -59,7 +59,7 @@ int + __lll_abstimed_wait_intr (void *ptr, int val, + const struct timespec *tsp, int flags, int clk) + { +- if (clk != CLOCK_REALTIME) ++ if (clk != CLOCK_REALTIME && clk != CLOCK_MONOTONIC) + return EINVAL; + + int mlsec = compute_reltime (tsp, clk); +@@ -79,7 +79,7 @@ int + __lll_abstimed_xwait (void *ptr, int lo, int hi, + const struct timespec *tsp, int flags, int clk) + { +- if (clk != CLOCK_REALTIME) ++ if (clk != CLOCK_REALTIME && clk != CLOCK_MONOTONIC) + return EINVAL; + + int mlsec = compute_reltime (tsp, clk); +@@ -91,7 +91,7 @@ int + __lll_abstimed_lock (void *ptr, + const struct timespec *tsp, int flags, int clk) + { +- if (clk != CLOCK_REALTIME) ++ if (clk != CLOCK_REALTIME && clk != CLOCK_MONOTONIC) + return EINVAL; + + if (__lll_trylock (ptr) == 0) +@@ -177,7 +177,7 @@ __lll_robust_abstimed_lock (void *ptr, + int wait_time = 25; + unsigned int val; + +- if (clk != CLOCK_REALTIME) ++ if (clk != CLOCK_REALTIME && clk != CLOCK_MONOTONIC) + return EINVAL; + + while (1) diff --git a/gnu/packages/patches/glibc-2.37-versioned-locpath.patch b/gnu/packages/patches/glibc-2.37-versioned-locpath.patch new file mode 100644 index 0000000000..0acaeb1e46 --- /dev/null +++ b/gnu/packages/patches/glibc-2.37-versioned-locpath.patch @@ -0,0 +1,264 @@ +From d73ba2caa10b8e9f51ff4239cc32eeb4e0de4279 Mon Sep 17 00:00:00 2001 +Message-Id: <d73ba2caa10b8e9f51ff4239cc32eeb4e0de4279.1683980025.git.dev@jpoiret.xyz> +From: Josselin Poiret <dev@jpoiret.xyz> +Date: Sat, 13 May 2023 14:10:43 +0200 +Subject: [PATCH] Add versioned locpath + +From: Josselin Poiret <dev@jpoiret.xyz> + +The format of locale data can be incompatible between libc versions, and +loading incompatible data can lead to 'setlocale' returning EINVAL at best +or triggering an assertion failure at worst. See +https://lists.gnu.org/archive/html/guix-devel/2015-09/msg00717.html +for background information. + +To address that, this patch changes libc to honor a new 'GUIX_LOCPATH' +variable, and to look for locale data in version-specific sub-directories of +that variable. So, if GUIX_LOCPATH=/foo:/bar, locale data is searched for in +/foo/X.Y and /bar/X.Y, where X.Y is the libc version number. + +That way, a single 'GUIX_LOCPATH' setting can work even if different libc +versions coexist on the system. + + +This patch is adapted from the 2.35 patch. + +--- + locale/newlocale.c | 15 ++-------- + locale/setlocale.c | 68 +++++++++++++++++++++++++++++++++++++------- + string/Makefile | 1 + + string/argz-suffix.c | 56 ++++++++++++++++++++++++++++++++++++ + string/argz.h | 10 +++++++ + 5 files changed, 127 insertions(+), 23 deletions(-) + create mode 100644 string/argz-suffix.c + +diff --git a/locale/newlocale.c b/locale/newlocale.c +index 108d2428bf..6218e0fa77 100644 +--- a/locale/newlocale.c ++++ b/locale/newlocale.c +@@ -29,6 +29,7 @@ + /* Lock for protecting global data. */ + __libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden) + ++extern error_t compute_locale_search_path (char **, size_t *); + + /* Use this when we come along an error. */ + #define ERROR_RETURN \ +@@ -47,7 +48,6 @@ __newlocale (int category_mask, const char *locale, locale_t base) + locale_t result_ptr; + char *locale_path; + size_t locale_path_len; +- const char *locpath_var; + int cnt; + size_t names_len; + +@@ -101,17 +101,8 @@ __newlocale (int category_mask, const char *locale, locale_t base) + locale_path = NULL; + locale_path_len = 0; + +- locpath_var = getenv ("LOCPATH"); +- if (locpath_var != NULL && locpath_var[0] != '\0') +- { +- if (__argz_create_sep (locpath_var, ':', +- &locale_path, &locale_path_len) != 0) +- return NULL; +- +- if (__argz_add_sep (&locale_path, &locale_path_len, +- _nl_default_locale_path, ':') != 0) +- return NULL; +- } ++ if (compute_locale_search_path (&locale_path, &locale_path_len) != 0) ++ return NULL; + + /* Get the names for the locales we are interested in. We either + allow a composite name or a single name. */ +diff --git a/locale/setlocale.c b/locale/setlocale.c +index dd73fa4248..d8eb799384 100644 +--- a/locale/setlocale.c ++++ b/locale/setlocale.c +@@ -213,12 +213,65 @@ setdata (int category, struct __locale_data *data) + } + } + ++/* Return in *LOCALE_PATH and *LOCALE_PATH_LEN the locale data search path as ++ a colon-separated list. Return ENOMEN on error, zero otherwise. */ ++error_t ++compute_locale_search_path (char **locale_path, size_t *locale_path_len) ++{ ++ char* guix_locpath_var = getenv ("GUIX_LOCPATH"); ++ char *locpath_var = getenv ("LOCPATH"); ++ ++ if (guix_locpath_var != NULL && guix_locpath_var[0] != '\0') ++ { ++ /* Entries in 'GUIX_LOCPATH' take precedence over 'LOCPATH'. These ++ entries are systematically prefixed with "/X.Y" where "X.Y" is the ++ libc version. */ ++ if (__argz_create_sep (guix_locpath_var, ':', ++ locale_path, locale_path_len) != 0 ++ || __argz_suffix_entries (locale_path, locale_path_len, ++ "/" VERSION) != 0) ++ goto bail_out; ++ } ++ ++ if (locpath_var != NULL && locpath_var[0] != '\0') ++ { ++ char *reg_locale_path = NULL; ++ size_t reg_locale_path_len = 0; ++ ++ if (__argz_create_sep (locpath_var, ':', ++ ®_locale_path, ®_locale_path_len) != 0) ++ goto bail_out; ++ ++ if (__argz_append (locale_path, locale_path_len, ++ reg_locale_path, reg_locale_path_len) != 0) ++ goto bail_out; ++ ++ free (reg_locale_path); ++ } ++ ++ if (*locale_path != NULL) ++ { ++ /* Append the system default locale directory. */ ++ if (__argz_add_sep (locale_path, locale_path_len, ++ _nl_default_locale_path, ':') != 0) ++ goto bail_out; ++ } ++ ++ return 0; ++ ++ bail_out: ++ free (*locale_path); ++ *locale_path = NULL; ++ *locale_path_len = 0; ++ ++ return ENOMEM; ++} ++ + char * + setlocale (int category, const char *locale) + { + char *locale_path; + size_t locale_path_len; +- const char *locpath_var; + char *composite; + + /* Sanity check for CATEGORY argument. */ +@@ -249,17 +302,10 @@ setlocale (int category, const char *locale) + locale_path = NULL; + locale_path_len = 0; + +- locpath_var = getenv ("LOCPATH"); +- if (locpath_var != NULL && locpath_var[0] != '\0') ++ if (compute_locale_search_path (&locale_path, &locale_path_len) != 0) + { +- if (__argz_create_sep (locpath_var, ':', +- &locale_path, &locale_path_len) != 0 +- || __argz_add_sep (&locale_path, &locale_path_len, +- _nl_default_locale_path, ':') != 0) +- { +- __libc_rwlock_unlock (__libc_setlocale_lock); +- return NULL; +- } ++ __libc_rwlock_unlock (__libc_setlocale_lock); ++ return NULL; + } + + if (category == LC_ALL) +diff --git a/string/Makefile b/string/Makefile +index 3eced0d027..a7e68729ad 100644 +--- a/string/Makefile ++++ b/string/Makefile +@@ -51,6 +51,7 @@ routines := \ + argz-next \ + argz-replace \ + argz-stringify \ ++ argz-suffix \ + basename \ + bcopy \ + bzero \ +diff --git a/string/argz-suffix.c b/string/argz-suffix.c +new file mode 100644 +index 0000000000..505b0f248c +--- /dev/null ++++ b/string/argz-suffix.c +@@ -0,0 +1,56 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ludovic Courtès <ludo@gnu.org>. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ <http://www.gnu.org/licenses/>. */ ++ ++#include <argz.h> ++#include <errno.h> ++#include <stdlib.h> ++#include <string.h> ++ ++ ++error_t ++__argz_suffix_entries (char **argz, size_t *argz_len, const char *suffix) ++ ++{ ++ size_t suffix_len = strlen (suffix); ++ size_t count = __argz_count (*argz, *argz_len); ++ size_t new_argz_len = *argz_len + count * suffix_len; ++ char *new_argz = malloc (new_argz_len); ++ ++ if (new_argz) ++ { ++ char *p = new_argz, *entry; ++ ++ for (entry = *argz; ++ entry != NULL; ++ entry = argz_next (*argz, *argz_len, entry)) ++ { ++ p = stpcpy (p, entry); ++ p = stpcpy (p, suffix); ++ p++; ++ } ++ ++ free (*argz); ++ *argz = new_argz; ++ *argz_len = new_argz_len; ++ ++ return 0; ++ } ++ else ++ return ENOMEM; ++} ++weak_alias (__argz_suffix_entries, argz_suffix_entries) +diff --git a/string/argz.h b/string/argz.h +index cbc588a8e6..bc6e484c9d 100644 +--- a/string/argz.h ++++ b/string/argz.h +@@ -108,6 +108,16 @@ extern error_t argz_replace (char **__restrict __argz, + const char *__restrict __str, + const char *__restrict __with, + unsigned int *__restrict __replace_count); ++ ++/* Suffix each entry of ARGZ & ARGZ_LEN with SUFFIX. Return 0 on success, ++ and ENOMEN if memory cannot be allocated. */ ++extern error_t __argz_suffix_entries (char **__restrict __argz, ++ size_t *__restrict __argz_len, ++ const char *__restrict __suffix); ++extern error_t argz_suffix_entries (char **__restrict __argz, ++ size_t *__restrict __argz_len, ++ const char *__restrict __suffix); ++ + + /* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there + are no more. If entry is NULL, then the first entry is returned. This +-- +2.40.1 + diff --git a/gnu/packages/patches/gnumach-add-missing-const_mach_port_name_array_t-type.patch b/gnu/packages/patches/gnumach-add-missing-const_mach_port_name_array_t-type.patch deleted file mode 100644 index 73c99ade23..0000000000 --- a/gnu/packages/patches/gnumach-add-missing-const_mach_port_name_array_t-type.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 17335d49a3c9e866a81abc051420d73a59d669bf Mon Sep 17 00:00:00 2001 -Message-Id: <17335d49a3c9e866a81abc051420d73a59d669bf.1678745341.git.dev@jpoiret.xyz> -From: Josselin Poiret <dev@jpoiret.xyz> -Date: Sun, 28 Aug 2022 01:17:34 +0200 -Subject: [PATCH] Add missing const_mach_port_name_array_t type - -From: Samuel Thibault <samuel.thibault@ens-lyon.org> - ---- - include/mach/port.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/include/mach/port.h b/include/mach/port.h -index 3c226f6c..d25eb0b4 100644 ---- a/include/mach/port.h -+++ b/include/mach/port.h -@@ -43,6 +43,7 @@ - */ - typedef unsigned int mach_port_name_t; - typedef mach_port_name_t *mach_port_name_array_t; -+typedef const mach_port_name_t *const_mach_port_name_array_t; - - /* - * A port is represented - -base-commit: 3e1702a65fb3caf50c8d09a1b383b0056a5efc82 -prerequisite-patch-id: 4688654277aef235ccd1797a72dce27d52b04616 -prerequisite-patch-id: 8f1e7dd6429c15cc8ed1d411dba0a75b6e745236 -prerequisite-patch-id: 605553ee086473ad9bc24e59c91d49a12dbf8631 --- -2.39.1 - diff --git a/gnu/packages/patches/gnumach-support-noide.patch b/gnu/packages/patches/gnumach-support-noide.patch new file mode 100644 index 0000000000..723d4bcac4 --- /dev/null +++ b/gnu/packages/patches/gnumach-support-noide.patch @@ -0,0 +1,25 @@ +Upstream status: Taken from Debian/upsream. + + https://salsa.debian.org/hurd-team/gnumach/-/blob/master/debian/patches/90_noide.patch + +This supports using `noide' on the gnumach command line, disabling +gnumach IDE support and thus forcing use of rumdisk. + +--- + linux/dev/glue/block.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/linux/dev/glue/block.c ++++ b/linux/dev/glue/block.c +@@ -207,7 +207,10 @@ int + blk_dev_init () + { + #ifdef CONFIG_BLK_DEV_IDE +- ide_init (); ++ extern char *kernel_cmdline; ++ if (strncmp(kernel_cmdline, "noide", 5) && ++ !strstr(kernel_cmdline, " noide")) ++ ide_init (); + #endif + #ifdef CONFIG_BLK_DEV_FD + floppy_init (); diff --git a/gnu/packages/patches/hurd-fix-rumpdisk-build.patch b/gnu/packages/patches/hurd-fix-rumpdisk-build.patch new file mode 100644 index 0000000000..4ecd5ed0ee --- /dev/null +++ b/gnu/packages/patches/hurd-fix-rumpdisk-build.patch @@ -0,0 +1,41 @@ +Upstream status: taken from upstream. + +From a2b0f721d077fdc5c9decb21b975b58fb51a3e8f Mon Sep 17 00:00:00 2001 +From: Janneke Nieuwenhuizen <janneke@gnu.org> +Date: Mon, 22 May 2023 19:21:47 +0200 +Subject: [PATCH] rumpdisk: Do not assume FHS /usr/lib, fixes Guix cross-build. + +--- + rumpdisk/Makefile | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/rumpdisk/Makefile b/rumpdisk/Makefile +index 60a209b3..b59aaf9a 100644 +--- a/rumpdisk/Makefile ++++ b/rumpdisk/Makefile +@@ -1,5 +1,5 @@ + # +-# Copyright (C) 2019 Free Software Foundation, Inc. ++# Copyright (C) 2019, 2023 Free Software Foundation, Inc. + # + # This program is free software; you can redistribute it and/or + # modify it under the terms of the GNU General Public License as +@@ -15,7 +15,6 @@ + # along with this program; if not, write to the Free Software + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +-RUMPPATH=/usr/lib + RUMPLIBS=rump rumpuser rumpdev rumpdev_disk rumpdev_pci rumpvfs rumpdev_ahcisata rumpdev_piixide rumpdev_ata + RUMPEXTRA=rumpdev_scsipi + +@@ -38,6 +37,6 @@ target = rumpdisk + OBJS = $(SRCS:.c=.o) + HURDLIBS = machdev ports trivfs shouldbeinlibc iohelp ihash fshelp + LDLIBS += -lpthread -lpciaccess -ldl +-LDLIBS += -Wl,--whole-archive $(RUMPLIBS:%=$(RUMPPATH)/lib%_pic.a) -Wl,--no-whole-archive $(RUMPEXTRA:%=$(RUMPPATH)/lib%_pic.a) ++LDLIBS += -Wl,--whole-archive $(RUMPLIBS:%=-l%_pic) -Wl,--no-whole-archive $(RUMPEXTRA:%=-l%_pic) + + include ../Makeconf +-- +2.40.1 + diff --git a/gnu/packages/patches/hurd-rumpdisk-no-hd.patch b/gnu/packages/patches/hurd-rumpdisk-no-hd.patch new file mode 100644 index 0000000000..4e5d41917d --- /dev/null +++ b/gnu/packages/patches/hurd-rumpdisk-no-hd.patch @@ -0,0 +1,26 @@ +This avoids rumpdisk crash when booting without "noide". + +Upstream status: Taken from Debian Salsa package git + + https://salsa.debian.org/hurd-team/hurd/-/blob/f40ff84260b5a98bea949013415a1c92c127a43e/debian/patches/rumpdisk-no-hd + +Index: hurd-debian/rumpdisk/block-rump.c +=================================================================== +--- hurd-debian.orig/rumpdisk/block-rump.c ++++ hurd-debian/rumpdisk/block-rump.c +@@ -143,7 +143,6 @@ rumpdisk_device_init (void) + { + device_t device; + +-#if 0 + if (! device_open (device_master, D_READ, "hd0", &device) + || ! device_open (device_master, D_READ, "hd1", &device) + || ! device_open (device_master, D_READ, "hd3", &device) +@@ -154,7 +153,6 @@ rumpdisk_device_init (void) + disabled = 1; + return; + } +-#endif + + if (! device_open (device_master, D_READ, "sd0", &device) + || ! device_open (device_master, D_READ, "sd1", &device) diff --git a/gnu/packages/patches/libmateweather-use-TZDIR.patch b/gnu/packages/patches/libmateweather-use-TZDIR.patch new file mode 100644 index 0000000000..5f72043986 --- /dev/null +++ b/gnu/packages/patches/libmateweather-use-TZDIR.patch @@ -0,0 +1,42 @@ +From 109fef8208188ddf4be76d6899f7d8fde5b8b3be Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= <iyzsong@member.fsf.org> +Date: Sat, 22 Jul 2023 14:40:31 +0800 +Subject: [PATCH] Use TZDIR for ZONEINFO_DIR if the variable is set. + +--- + libmateweather/mateweather-timezone.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/libmateweather/mateweather-timezone.c b/libmateweather/mateweather-timezone.c +index 2754728..6c858c4 100644 +--- a/libmateweather/mateweather-timezone.c ++++ b/libmateweather/mateweather-timezone.c +@@ -61,7 +61,7 @@ static gboolean + parse_tzdata (const char *tzname, time_t start, time_t end, + int *offset, gboolean *has_dst, int *dst_offset) + { +- char *filename, *contents; ++ char *tzdir, *filename, *contents; + gsize length; + int timecnt, transitions_size, ttinfo_map_size; + int initial_transition = -1, second_transition = -1; +@@ -71,7 +71,10 @@ parse_tzdata (const char *tzname, time_t start, time_t end, + char initial_isdst, second_isdst; + int i; + +- filename = g_build_filename (ZONEINFO_DIR, tzname, NULL); ++ tzdir = g_getenv("TZDIR"); ++ if (tzdir == NULL) ++ tzdir = ZONEINFO_DIR; ++ filename = g_build_filename (tzdir, tzname, NULL); + if (!g_file_get_contents (filename, &contents, &length, NULL)) { + g_free (filename); + return FALSE; +@@ -403,4 +406,3 @@ mateweather_timezone_get_dst_offset (MateWeatherTimezone *zone) + g_return_val_if_fail (zone->has_dst, 0); + return zone->dst_offset; + } +- +-- +2.41.0 + diff --git a/gnu/packages/patches/linux-libre-wireguard-postup-privkey.patch b/gnu/packages/patches/linux-libre-wireguard-postup-privkey.patch new file mode 100644 index 0000000000..a6050499e1 --- /dev/null +++ b/gnu/packages/patches/linux-libre-wireguard-postup-privkey.patch @@ -0,0 +1,119 @@ +From 3ac1bf099766f1e9735883d5127148054cd5b30a Mon Sep 17 00:00:00 2001 +From: "Jason A. Donenfeld" <Jason@zx2c4.com> +Date: Thu, 18 May 2023 03:08:44 +0200 +Subject: wireguard: netlink: send staged packets when setting initial private + key + +Packets bound for peers can queue up prior to the device private key +being set. For example, if persistent keepalive is set, a packet is +queued up to be sent as soon as the device comes up. However, if the +private key hasn't been set yet, the handshake message never sends, and +no timer is armed to retry, since that would be pointless. + +But, if a user later sets a private key, the expectation is that those +queued packets, such as a persistent keepalive, are actually sent. So +adjust the configuration logic to account for this edge case, and add a +test case to make sure this works. + +Maxim noticed this with a wg-quick(8) config to the tune of: + + [Interface] + PostUp = wg set %i private-key somefile + + [Peer] + PublicKey = ... + Endpoint = ... + PersistentKeepalive = 25 + +Here, the private key gets set after the device comes up using a PostUp +script, triggering the bug. + +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Cc: stable@vger.kernel.org +Reported-by: Maxim Cournoyer <maxim.cournoyer@gmail.com> +Link: https://lore.kernel.org/wireguard/87fs7xtqrv.fsf@gmail.com/ +Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> +--- + drivers/net/wireguard/netlink.c | 14 +++++++++----- + tools/testing/selftests/wireguard/netns.sh | 30 ++++++++++++++++++++++++++---- + 2 files changed, 35 insertions(+), 9 deletions(-) + +diff --git a/drivers/net/wireguard/netlink.c b/drivers/net/wireguard/netlink.c +index 43c8c84e7ea8..6d1bd9f52d02 100644 +--- a/drivers/net/wireguard/netlink.c ++++ b/drivers/net/wireguard/netlink.c +@@ -546,6 +546,7 @@ static int wg_set_device(struct sk_buff *skb, struct genl_info *info) + u8 *private_key = nla_data(info->attrs[WGDEVICE_A_PRIVATE_KEY]); + u8 public_key[NOISE_PUBLIC_KEY_LEN]; + struct wg_peer *peer, *temp; ++ bool send_staged_packets; + + if (!crypto_memneq(wg->static_identity.static_private, + private_key, NOISE_PUBLIC_KEY_LEN)) +@@ -564,14 +565,17 @@ static int wg_set_device(struct sk_buff *skb, struct genl_info *info) + } + + down_write(&wg->static_identity.lock); +- wg_noise_set_static_identity_private_key(&wg->static_identity, +- private_key); +- list_for_each_entry_safe(peer, temp, &wg->peer_list, +- peer_list) { ++ send_staged_packets = !wg->static_identity.has_identity && netif_running(wg->dev); ++ wg_noise_set_static_identity_private_key(&wg->static_identity, private_key); ++ send_staged_packets = send_staged_packets && wg->static_identity.has_identity; ++ ++ wg_cookie_checker_precompute_device_keys(&wg->cookie_checker); ++ list_for_each_entry_safe(peer, temp, &wg->peer_list, peer_list) { + wg_noise_precompute_static_static(peer); + wg_noise_expire_current_peer_keypairs(peer); ++ if (send_staged_packets) ++ wg_packet_send_staged_packets(peer); + } +- wg_cookie_checker_precompute_device_keys(&wg->cookie_checker); + up_write(&wg->static_identity.lock); + } + skip_set_private_key: +diff --git a/tools/testing/selftests/wireguard/netns.sh b/tools/testing/selftests/wireguard/netns.sh +index 69c7796c7ca9..405ff262ca93 100755 +--- a/tools/testing/selftests/wireguard/netns.sh ++++ b/tools/testing/selftests/wireguard/netns.sh +@@ -514,10 +514,32 @@ n2 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/all/rp_filter' + n1 ping -W 1 -c 1 192.168.241.2 + [[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.3:1" ]] + +-ip1 link del veth1 +-ip1 link del veth3 +-ip1 link del wg0 +-ip2 link del wg0 ++ip1 link del dev veth3 ++ip1 link del dev wg0 ++ip2 link del dev wg0 ++ ++# Make sure persistent keep alives are sent when an adapter comes up ++ip1 link add dev wg0 type wireguard ++n1 wg set wg0 private-key <(echo "$key1") peer "$pub2" endpoint 10.0.0.1:1 persistent-keepalive 1 ++read _ _ tx_bytes < <(n1 wg show wg0 transfer) ++[[ $tx_bytes -eq 0 ]] ++ip1 link set dev wg0 up ++read _ _ tx_bytes < <(n1 wg show wg0 transfer) ++[[ $tx_bytes -gt 0 ]] ++ip1 link del dev wg0 ++# This should also happen even if the private key is set later ++ip1 link add dev wg0 type wireguard ++n1 wg set wg0 peer "$pub2" endpoint 10.0.0.1:1 persistent-keepalive 1 ++read _ _ tx_bytes < <(n1 wg show wg0 transfer) ++[[ $tx_bytes -eq 0 ]] ++ip1 link set dev wg0 up ++read _ _ tx_bytes < <(n1 wg show wg0 transfer) ++[[ $tx_bytes -eq 0 ]] ++n1 wg set wg0 private-key <(echo "$key1") ++read _ _ tx_bytes < <(n1 wg show wg0 transfer) ++[[ $tx_bytes -gt 0 ]] ++ip1 link del dev veth1 ++ip1 link del dev wg0 + + # We test that Netlink/IPC is working properly by doing things that usually cause split responses + ip0 link add dev wg0 type wireguard +-- +cgit v1.2.3-59-g8ed1b + diff --git a/gnu/packages/patches/mactelnet-remove-init.patch b/gnu/packages/patches/mactelnet-remove-init.patch new file mode 100644 index 0000000000..82372e3fe4 --- /dev/null +++ b/gnu/packages/patches/mactelnet-remove-init.patch @@ -0,0 +1,98 @@ +From ca2dff0b97df0ceb8f6357de3a4375ebc09646dd Mon Sep 17 00:00:00 2001 +Message-Id: <ca2dff0b97df0ceb8f6357de3a4375ebc09646dd.1688572750.git.mirai@makinata.eu> +From: Bruno Victal <mirai@makinata.eu> +Date: Wed, 5 Jul 2023 16:43:31 +0100 +Subject: [PATCH] Skip installing init file. + +The file refers to hardcoded paths. +--- + Makefile.am | 2 +- + config/Makefile.am | 5 ----- + config/mactelnetd.init | 21 --------------------- + config/mactelnetd.users | 12 ------------ + configure.ac | 2 +- + 5 files changed, 2 insertions(+), 40 deletions(-) + delete mode 100644 config/Makefile.am + delete mode 100644 config/mactelnetd.init + delete mode 100644 config/mactelnetd.users + +diff --git a/Makefile.am b/Makefile.am +index 4e67178..264d8ea 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,5 +1,5 @@ + AUTOMAKE_OPTIONS = foreign +-SUBDIRS = src doc config po ++SUBDIRS = src doc po + + CFLAGS = --pedantic -Wall -std=c99 -O3 + LDFLAGS = +diff --git a/config/Makefile.am b/config/Makefile.am +deleted file mode 100644 +index 574a2e0..0000000 +--- a/config/Makefile.am ++++ /dev/null +@@ -1,5 +0,0 @@ +-dist_sysconf_DATA = mactelnetd.users +- +-install-exec-hook: +- chmod 600 $(DESTDIR)$(sysconfdir)/mactelnetd.users +- chown root $(DESTDIR)$(sysconfdir)/mactelnetd.users +diff --git a/config/mactelnetd.init b/config/mactelnetd.init +deleted file mode 100644 +index b7ddddf..0000000 +--- a/config/mactelnetd.init ++++ /dev/null +@@ -1,21 +0,0 @@ +-# mactelnetd - MAC-Telnet server +-# +-# The MAC-Telnet server provides telnet access via MAC addresses. +-# +-# Ubuntu upstart config: +- +-description "MAC-Telnet server" +- +-start on filesystem +-stop on runlevel [!2345] +- +-respawn +-respawn limit 10 5 +-umask 022 +- +-pre-start script +- test -O /etc/mactelnetd.users || { stop; exit 0; } +- test -x /usr/sbin/mactelnetd || { stop; exit 0; } +-end script +- +-exec /usr/sbin/mactelnetd -f +diff --git a/config/mactelnetd.users b/config/mactelnetd.users +deleted file mode 100644 +index c140e36..0000000 +--- a/config/mactelnetd.users ++++ /dev/null +@@ -1,12 +0,0 @@ +-# Users file for MAC-Telnetd +-# +-#################################################################### +-# WARNING: This file has passwords written in plain-text. # +-# Make sure this file is owned and only readable by root. # +-#################################################################### +-# +-# Each line consists of a username and a password seperated by :. +-# Usernames must be existing users from passwd. +-# +-# Format: +-#username:password +diff --git a/configure.ac b/configure.ac +index c0fdda4..9d2f7d7 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -34,4 +34,4 @@ AC_FUNC_MALLOC + AC_FUNC_STRNLEN + AC_CHECK_FUNCS([alarm bzero clock_gettime getpass gettimeofday inet_ntoa memset select setenv setlocale socket strcasecmp strerror strncasecmp sysinfo uname]) + +-AC_OUTPUT(Makefile src/Makefile doc/Makefile config/Makefile po/Makefile.in) ++AC_OUTPUT(Makefile src/Makefile doc/Makefile po/Makefile.in) +-- +2.40.1 + diff --git a/gnu/packages/patches/mig-cpu.h-generation.patch b/gnu/packages/patches/mig-cpu.h-generation.patch deleted file mode 100644 index 3030eaeaa6..0000000000 --- a/gnu/packages/patches/mig-cpu.h-generation.patch +++ /dev/null @@ -1,16 +0,0 @@ -Backport MiG commit 73fbf2504ae606dda81372701a67dad6fee0865e: - - From: Flavio Cruz <flaviocruz@gmail.com> - Subject: Generate cpu.h with -ffreestanding - ---- a/Makefile.in 2023-03-26 23:02:51.384318331 +0200 -+++ b/Makefile.in 2023-03-26 23:03:03.300329369 +0200 -@@ -1051,7 +1051,7 @@ uninstall-am: uninstall-binSCRIPTS unins - .sym.symc: - $(AWK_V) $(AWK) -f $(srcdir)/gensym.awk $< > $@ - .symc.symo: -- $(AM_V_CC) $(TARGET_CC) -S $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -x c -o $@ $< -+ $(AM_V_CC) $(TARGET_CC) -S $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -ffreestanding -x c -o $@ $< - .symo.h: - $(AM_V_GEN) sed -e '/^[^*].*$$/d' -e 's/^[*]/#define/' -e 's/mAgIc[^-0-9]*//' \ - $< > $@ diff --git a/gnu/packages/patches/netdde-build-fix.patch b/gnu/packages/patches/netdde-build-fix.patch new file mode 100644 index 0000000000..f7f0fc35a9 --- /dev/null +++ b/gnu/packages/patches/netdde-build-fix.patch @@ -0,0 +1,28 @@ +Upstream status: Presented upstream. + + https://lists.gnu.org/archive/html/bug-hurd/2023-05//msg00449.html + +From b0a7e4f2706bea8d1c80d5af7a095941f9635033 Mon Sep 17 00:00:00 2001 +From: Janneke Nieuwenhuizen <janneke@gnu.org> +Date: Fri, 26 May 2023 17:39:17 +0200 +Subject: [PATCH] Update for .../rumpdisk: Fix race condition in bootstrap + +--- + machdev.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/machdev.c b/machdev.c +index dda5eb8ba..1a6811072 100644 +--- a/machdev.c ++++ b/machdev.c +@@ -18,5 +18,6 @@ void machdev_run1 (void *arg) + + void machdev_run2(void) + { +- machdev_trivfs_server(bootstrap); ++ machdev_trivfs_server_startup(bootstrap); ++ machdev_trivfs_server_loop(NULL); + } +-- +2.40.1 + diff --git a/gnu/packages/patches/oath-toolkit-xmlsec-compat.patch b/gnu/packages/patches/oath-toolkit-xmlsec-compat.patch deleted file mode 100644 index 18589366a9..0000000000 --- a/gnu/packages/patches/oath-toolkit-xmlsec-compat.patch +++ /dev/null @@ -1,79 +0,0 @@ -Adjust tests for compatibility with newer xmlsec. - -Taken from upstream: - - https://gitlab.com/oath-toolkit/oath-toolkit/-/commit/0ae59b9c72f69ee21044e736e292b73051df3272 - -diff --git a/libpskc/examples/pskc-hotp-signed.xml b/libpskc/examples/pskc-hotp-signed.xml -index 359dd4723cf2b5ae1ca53d793cc6900a15bd4969..396e0829ff245b3ad6953cc3523d77568c8a18f4 100644 ---- a/libpskc/examples/pskc-hotp-signed.xml -+++ b/libpskc/examples/pskc-hotp-signed.xml -@@ -38,7 +38,8 @@ rIXbwqKhnBP943U4Ch31oEbZtbo+XRbiq11wv6dLNsi76TNGDqsjTKgEcSIYI6Vd - rMxnil6ChoIBvSSPGHhJuj1bW1EPW92JtIa6byrAj1m4RwSviQy2i65YoIdtrhRt - CWekj2zuL/0szv5rZMCCvxioOCA8znqELEPMfs0Aa/cACD2MZcC4gGXehNCvzYJr - TmB6lFpxP6f0g6eO7PVcqYN9NCwECxb5Cvx2j2uNlereY35/9oPR6YJx+V7sL+DB --n6F0mN8OUAFxDamepKdGRApU8uZ35624o/I4</X509Certificate> -+n6F0mN8OUAFxDamepKdGRApU8uZ35624o/I4 -+</X509Certificate> - </X509Data> - </KeyInfo> - </Signature></KeyContainer> -diff --git a/pskctool/tests/pskc-all-signed.xml b/pskctool/tests/pskc-all-signed.xml -index 39cf8af5bb00e34fa5e1acb97cea59ff742758f4..5d44e72d928ccf1f46975e6ccca58297e235be95 100644 ---- a/pskctool/tests/pskc-all-signed.xml -+++ b/pskctool/tests/pskc-all-signed.xml -@@ -38,7 +38,8 @@ rIXbwqKhnBP943U4Ch31oEbZtbo+XRbiq11wv6dLNsi76TNGDqsjTKgEcSIYI6Vd - rMxnil6ChoIBvSSPGHhJuj1bW1EPW92JtIa6byrAj1m4RwSviQy2i65YoIdtrhRt - CWekj2zuL/0szv5rZMCCvxioOCA8znqELEPMfs0Aa/cACD2MZcC4gGXehNCvzYJr - TmB6lFpxP6f0g6eO7PVcqYN9NCwECxb5Cvx2j2uNlereY35/9oPR6YJx+V7sL+DB --n6F0mN8OUAFxDamepKdGRApU8uZ35624o/I4</X509Certificate> -+n6F0mN8OUAFxDamepKdGRApU8uZ35624o/I4 -+</X509Certificate> - </X509Data> - </KeyInfo> - </Signature></KeyContainer> -diff --git a/pskctool/tests/tst_libexamples.sh b/pskctool/tests/tst_libexamples.sh -index 0e8e558b4cbefbac9f2ca301fddb2ac4b8cfbdfa..5cb52ce44f40a78ab886ff12d2eac64e5b5c4c7e 100755 ---- a/pskctool/tests/tst_libexamples.sh -+++ b/pskctool/tests/tst_libexamples.sh -@@ -1,7 +1,7 @@ - #!/bin/sh - - # tst_libexamples.sh - keep pskctool output in GTK-DOC manual up to date --# Copyright (C) 2012-2021 Simon Josefsson -+# Copyright (C) 2012-2022 Simon Josefsson - - # This program is free software: you can redistribute it and/or modify - # it under the terms of the GNU General Public License as published by -@@ -45,7 +45,8 @@ fi - - $PSKCTOOL --sign --sign-key $srcdir/pskc-ee-key.pem \ - --sign-crt $srcdir/pskc-ee-crt.pem \ -- $srcdir/../../libpskc/examples/pskc-hotp.xml > foo -+ $srcdir/../../libpskc/examples/pskc-hotp.xml \ -+ | sed 's,4</X509Cert,4\n</X509Cert,' > foo - if ! diff -ur $srcdir/../../libpskc/examples/pskc-hotp-signed.xml foo; then - echo "FAIL: pskctool --sign output change, commit updated file." - exit 1 -diff --git a/pskctool/tests/tst_sign.sh b/pskctool/tests/tst_sign.sh -index b62757336061394746d60f706369127fe1db466d..2d452d69f2e6595ff85a34540939801324dbdfea 100755 ---- a/pskctool/tests/tst_sign.sh -+++ b/pskctool/tests/tst_sign.sh -@@ -1,7 +1,7 @@ - #!/bin/sh - - # tst_sign.sh - test that pskctool can sign and verify --# Copyright (C) 2012-2021 Simon Josefsson -+# Copyright (C) 2012-2022 Simon Josefsson - - # This program is free software: you can redistribute it and/or modify - # it under the terms of the GNU General Public License as published by -@@ -32,7 +32,7 @@ $PSKCTOOL --info --strict --debug $pskc_all > tmp-pre-human.txt - $PSKCTOOL --sign \ - --sign-key $pskc_ee_key \ - --sign-crt $pskc_ee_crt \ -- $pskc_all > tmp-signed.xml -+ $pskc_all | sed 's,4</X509Cert,4\n</X509Cert,' > tmp-signed.xml - - diff -ur $pskc_all_signed tmp-signed.xml - diff --git a/gnu/packages/patches/qxlsx-fix-include-directory.patch b/gnu/packages/patches/qxlsx-fix-include-directory.patch new file mode 100644 index 0000000000..a68ca0cc3b --- /dev/null +++ b/gnu/packages/patches/qxlsx-fix-include-directory.patch @@ -0,0 +1,24 @@ +From 8c3e6633e3c901bc5a5cd477383421b0980dcd26 Mon Sep 17 00:00:00 2001 +From: Alexey Sokolov <sokolov@google.com> +Date: Mon, 17 Apr 2023 23:43:59 +0100 +Subject: [PATCH] Fix #278 + +There's no real reason to install the same headers twice, but at least +now clients of the library can build again +--- + QXlsx/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/QXlsx/CMakeLists.txt b/QXlsx/CMakeLists.txt +index 4fa7f7f1..074922a8 100644 +--- a/QXlsx/CMakeLists.txt ++++ b/QXlsx/CMakeLists.txt +@@ -179,7 +179,7 @@ PRIVATE + ${QXLSX_HEADERPATH} + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/header> +- $<INSTALL_INTERFACE:include/QXlsx> ++ $<INSTALL_INTERFACE:include/QXlsxQt${QT_VERSION_MAJOR}> + ) + + set_target_properties(QXlsx PROPERTIES diff --git a/gnu/packages/patches/racket-rktboot-riscv64-support.patch b/gnu/packages/patches/racket-rktboot-riscv64-support.patch new file mode 100644 index 0000000000..f268b1e7f8 --- /dev/null +++ b/gnu/packages/patches/racket-rktboot-riscv64-support.patch @@ -0,0 +1,15 @@ +Submitted upstream: +https://github.com/racket/racket/pull/4703 + +diff --git a/racket/src/rktboot/machine-def.rkt b/racket/src/rktboot/machine-def.rkt +index 8ff0688..59ebfc8 100644 +--- a/racket/src/rktboot/machine-def.rkt ++++ b/racket/src/rktboot/machine-def.rkt +@@ -25,6 +25,7 @@ + [(regexp-match? #rx"^t?arm32" target-machine) "arm32"] + [(regexp-match? #rx"^t?arm64" target-machine) "arm64"] + [(regexp-match? #rx"^t?ppc32" target-machine) "ppc32"] ++ [(regexp-match? #rx"^t?rv64" target-machine) "rv64"] + [(regexp-match? #rx"^t?pb" target-machine) "pb"] + [else (error "machine.def: cannot infer architecture")]))] + [s (regexp-replace* #rx"[$][(]Mend[)]" s diff --git a/gnu/packages/patches/sssd-system-directories.patch b/gnu/packages/patches/sssd-system-directories.patch index ce0dcf5d4d..cc37ac6024 100644 --- a/gnu/packages/patches/sssd-system-directories.patch +++ b/gnu/packages/patches/sssd-system-directories.patch @@ -2,19 +2,10 @@ Do not attempt to create $localstatedir and $sysconfdir (i.e., /var and /etc) upon "make install". diff --git a/Makefile.am b/Makefile.am -index 0de53a2c8..51ad57bf1 100644 +index e780e8a14..afd2b0a49 100644 --- a/Makefile.am +++ b/Makefile.am -@@ -58,7 +58,7 @@ sssddatadir = $(datadir)/sssd - sssdapiplugindir = $(sssddatadir)/sssd.api.d - sssdtapscriptdir = $(sssddatadir)/systemtap - krb5snippetsdir = $(sssddatadir)/krb5-snippets --dbuspolicydir = $(sysconfdir)/dbus-1/system.d -+dbuspolicydir = $(prefix)/etc/dbus-1/system.d - dbusservicedir = $(datadir)/dbus-1/system-services - sss_statedir = $(localstatedir)/lib/sss - runstatedir = @runstatedir@ -@@ -85,7 +85,7 @@ pkgconfigdir = $(libdir)/pkgconfig +@@ -84,7 +84,7 @@ pkgconfigdir = $(libdir)/pkgconfig krb5rcachedir = @krb5rcachedir@ sudolibdir = @sudolibpath@ polkitdir = @polkitdir@ @@ -23,7 +14,7 @@ index 0de53a2c8..51ad57bf1 100644 systemtap_tapdir = @tapset_dir@ sssdkcmdatadir = $(datadir)/sssd-kcm deskprofilepath = $(sss_statedir)/deskprofile -@@ -5195,7 +5195,6 @@ installsssddirs:: +@@ -5378,7 +5378,6 @@ installsssddirs:: $(DESTDIR)$(bindir) \ $(DESTDIR)$(sbindir) \ $(DESTDIR)$(mandir) \ @@ -31,7 +22,7 @@ index 0de53a2c8..51ad57bf1 100644 $(DESTDIR)$(pluginpath) \ $(DESTDIR)$(libdir)/ldb \ $(DESTDIR)$(dbuspolicydir) \ -@@ -5205,24 +5204,12 @@ installsssddirs:: +@@ -5388,24 +5387,12 @@ installsssddirs:: $(DESTDIR)$(sssddatadir) \ $(DESTDIR)$(sudolibdir) \ $(DESTDIR)$(autofslibdir) \ @@ -56,7 +47,7 @@ index 0de53a2c8..51ad57bf1 100644 if HAVE_DOXYGEN docs: -@@ -5338,7 +5325,6 @@ if BUILD_SAMBA +@@ -5523,7 +5510,6 @@ if BUILD_SAMBA endif if BUILD_KCM $(MKDIR_P) $(DESTDIR)/$(sssdkcmdatadir) diff --git a/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch b/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch deleted file mode 100644 index fb29b76ef2..0000000000 --- a/gnu/packages/patches/texlive-hyph-utf8-no-byebug.patch +++ /dev/null @@ -1,13 +0,0 @@ -Description: Avoid dependency on byebug to reduce package closure - significantly, see https://issues.guix.gnu.org/55997 -diff --git a/lib/tex/hyphen/language.rb b/lib/tex/hyphen/language.rb -index 12831417..df6daa39 100644 ---- a/lib/tex/hyphen/language.rb -+++ b/lib/tex/hyphen/language.rb -@@ -1,6 +1,5 @@ - require 'yaml' - require 'hydra' --require 'byebug' - - require_relative 'path' - diff --git a/gnu/packages/patches/u-boot-allow-disabling-openssl.patch b/gnu/packages/patches/u-boot-allow-disabling-openssl.patch index 5f2856dbb4..5195a7a6f8 100644 --- a/gnu/packages/patches/u-boot-allow-disabling-openssl.patch +++ b/gnu/packages/patches/u-boot-allow-disabling-openssl.patch @@ -128,29 +128,28 @@ index 94b7685392..eec599b0ee 100644 datai = 0; for (cfgi = 0; cfgi < cfgn; cfgi++) { e = &image_cfg[cfgi]; -@@ -1552,9 +1568,11 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params, +@@ -1624,10 +1640,12 @@ static void *image_create_v1(size_t *dataoff, struct image_tool_params *params, &datai, delay); } +#if defined(CONFIG_KWB_SECURE) - if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz + headersz, - headersz, image, secure_hdr)) + if (secure_hdr && add_secure_header_v1(params, ptr + *dataoff, payloadsz, + image, headersz, secure_hdr)) return NULL; +#endif - *imagesz = headersz; + /* Calculate and set the header checksum */ + main_hdr->checksum = image_checksum8(main_hdr, headersz); --- a/tools/image-host.c +++ b/tools/image-host.c -@@ -14,10 +14,12 @@ +@@ -14,8 +14,10 @@ #include <image.h> #include <version.h> +#ifdef CONFIG_FIT_PRELOAD #include <openssl/pem.h> #include <openssl/evp.h> - - #define IMAGE_PRE_LOAD_PATH "/image/pre-load/sig" +#endif /** diff --git a/gnu/packages/patches/u-boot-fix-u-boot-lib-build.patch b/gnu/packages/patches/u-boot-fix-u-boot-lib-build.patch new file mode 100644 index 0000000000..233c437de6 --- /dev/null +++ b/gnu/packages/patches/u-boot-fix-u-boot-lib-build.patch @@ -0,0 +1,24 @@ +Submitted upstream (see: +https://lists.denx.de/pipermail/u-boot/2023-July/521984.html) + +diff --git a/tools/u_boot_pylib/pyproject.toml b/tools/u_boot_pylib/pyproject.toml +index 3f33caf6f8..037c5d629e 100644 +--- a/tools/u_boot_pylib/pyproject.toml ++++ b/tools/u_boot_pylib/pyproject.toml +@@ -9,7 +9,7 @@ authors = [ + { name="Simon Glass", email="sjg@chromium.org" }, + ] + description = "U-Boot python library" +-readme = "README.md" ++readme = "README.rst" + requires-python = ">=3.7" + classifiers = [ + "Programming Language :: Python :: 3", +@@ -20,3 +20,7 @@ classifiers = [ + [project.urls] + "Homepage" = "https://u-boot.readthedocs.io" + "Bug Tracker" = "https://source.denx.de/groups/u-boot/-/issues" ++ ++[tool.setuptools.packages.find] ++where = [".."] ++include = ["u_boot_pylib*"] diff --git a/gnu/packages/patches/u-boot-infodocs-target.patch b/gnu/packages/patches/u-boot-infodocs-target.patch deleted file mode 100644 index 5b21a99de3..0000000000 --- a/gnu/packages/patches/u-boot-infodocs-target.patch +++ /dev/null @@ -1,84 +0,0 @@ -Upstream status: https://patchwork.ozlabs.org/project/uboot/list/?series=333259 - -diff --git a/Makefile b/Makefile -index de5746399a..597a8886c3 100644 ---- a/Makefile -+++ b/Makefile -@@ -2372,7 +2372,7 @@ tcheck: - # Documentation targets - # --------------------------------------------------------------------------- - DOC_TARGETS := xmldocs latexdocs pdfdocs htmldocs epubdocs cleandocs \ -- linkcheckdocs dochelp refcheckdocs -+ linkcheckdocs dochelp refcheckdocs texinfodocs infodocs - PHONY += $(DOC_TARGETS) - $(DOC_TARGETS): scripts_basic FORCE - $(Q)$(MAKE) $(build)=doc $@ -diff --git a/doc/Makefile b/doc/Makefile -index f5de65e927..d0904a9f99 100644 ---- a/doc/Makefile -+++ b/doc/Makefile -@@ -69,6 +69,14 @@ quiet_cmd_sphinx = SPHINX $@ --> file://$(abspath $(BUILDDIR)/$3/$4) - htmldocs: - @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var))) - -+texinfodocs: -+ @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,texinfo,$(var),texinfo,$(var))) -+ -+# Note: the 'info' Make target is generated by sphinx itself when -+# running the texinfodocs target defined above. -+infodocs: texinfodocs -+ $(MAKE) -C $(BUILDDIR)/texinfo info -+ - linkcheckdocs: - @$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,linkcheck,$(var),,$(var))) - -@@ -109,6 +117,8 @@ cleandocs: - dochelp: - @echo ' U-Boot documentation in different formats from ReST:' - @echo ' htmldocs - HTML' -+ @echo ' texinfodocs - Texinfo' -+ @echo ' infodocs - Info' - @echo ' latexdocs - LaTeX' - @echo ' pdfdocs - PDF' - @echo ' epubdocs - EPUB' -diff --git a/doc/conf.py b/doc/conf.py -index 62c8d31270..3db70f80c1 100644 ---- a/doc/conf.py -+++ b/doc/conf.py -@@ -449,7 +449,7 @@ for fn in os.listdir('.'): - # One entry per manual page. List of tuples - # (source start file, name, description, authors, manual section). - man_pages = [ -- (master_doc, 'dasuboot', 'The U-Boot Documentation', -+ (master_doc, 'u-boot', 'The U-Boot Documentation', - [author], 1) - ] - -@@ -463,8 +463,8 @@ man_pages = [ - # (source start file, target name, title, author, - # dir menu entry, description, category) - texinfo_documents = [ -- (master_doc, 'DasUBoot', 'The U-Boot Documentation', -- author, 'DasUBoot', 'One line description of project.', -+ (master_doc, 'u-boot', 'The U-Boot Documentation', -+ author, 'U-Boot', 'Boot loader for embedded systems', - 'Miscellaneous'), - ] - -diff --git a/doc/media/Makefile b/doc/media/Makefile -index b9b43a34c3..9b32258696 100644 ---- a/doc/media/Makefile -+++ b/doc/media/Makefile -@@ -22,10 +22,11 @@ $(BUILDDIR)/linker_lists.h.rst: ${API}/linker_lists.h ${PARSER} $(SRC_DIR)/linke - - # Media build rules - --.PHONY: all html epub xml latex -+.PHONY: all html texinfo epub xml latex - - all: $(IMGDOT) $(BUILDDIR) ${TARGETS} - html: all -+texinfo: all - epub: all - xml: all - latex: $(IMGPDF) all diff --git a/gnu/packages/patches/u-boot-patman-guix-integration.patch b/gnu/packages/patches/u-boot-patman-guix-integration.patch deleted file mode 100644 index 3472656c99..0000000000 --- a/gnu/packages/patches/u-boot-patman-guix-integration.patch +++ /dev/null @@ -1,1244 +0,0 @@ -These changes correspond to commits 9ff7500ace..3154de3dd6 already merged to -the u-boot-dm custodian repo (at -https://source.denx.de/u-boot/custodians/u-boot-dm/-/commits/next), scheduled -to be pulled after the next release. - -diff --git a/tools/patman/__init__.py b/tools/patman/__init__.py -index c9d3e35052..1b98ec7fee 100644 ---- a/tools/patman/__init__.py -+++ b/tools/patman/__init__.py -@@ -1,6 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0+ - - __all__ = ['checkpatch', 'command', 'commit', 'control', 'cros_subprocess', -- 'func_test', 'get_maintainer', 'gitutil', 'main', 'patchstream', -+ 'func_test', 'get_maintainer', 'gitutil', '__main__', 'patchstream', - 'project', 'series', 'setup', 'settings', 'terminal', - 'test_checkpatch', 'test_util', 'tools', 'tout'] -diff --git a/tools/patman/main.py b/tools/patman/__main__.py -similarity index 89% -rename from tools/patman/main.py -rename to tools/patman/__main__.py -index 8067a288ab..749e6348b6 100755 ---- a/tools/patman/main.py -+++ b/tools/patman/__main__.py -@@ -7,6 +7,7 @@ - """See README for more information""" - - from argparse import ArgumentParser -+import importlib.resources - import os - import re - import sys -@@ -19,6 +20,7 @@ if __name__ == "__main__": - - # Our modules - from patman import control -+from patman import func_test - from patman import gitutil - from patman import project - from patman import settings -@@ -53,7 +55,8 @@ parser.add_argument('-H', '--full-help', action='store_true', dest='full_help', - default=False, help='Display the README file') - - subparsers = parser.add_subparsers(dest='cmd') --send = subparsers.add_parser('send') -+send = subparsers.add_parser( -+ 'send', help='Format, check and email patches (default command)') - send.add_argument('-i', '--ignore-errors', action='store_true', - dest='ignore_errors', default=False, - help='Send patches email even if patch errors are found') -@@ -62,6 +65,12 @@ send.add_argument('-l', '--limit-cc', dest='limit', type=int, default=None, - send.add_argument('-m', '--no-maintainers', action='store_false', - dest='add_maintainers', default=True, - help="Don't cc the file maintainers automatically") -+send.add_argument( -+ '--get-maintainer-script', dest='get_maintainer_script', type=str, -+ action='store', -+ default=os.path.join(gitutil.get_top_level(), 'scripts', -+ 'get_maintainer.pl') + ' --norolestats', -+ help='File name of the get_maintainer.pl (or compatible) script.') - send.add_argument('-n', '--dry-run', action='store_true', dest='dry_run', - default=False, help="Do a dry run (create but don't email patches)") - send.add_argument('-r', '--in-reply-to', type=str, action='store', -@@ -94,9 +103,11 @@ send.add_argument('--smtp-server', type=str, - - send.add_argument('patchfiles', nargs='*') - --test_parser = subparsers.add_parser('test', help='Run tests') --test_parser.add_argument('testname', type=str, default=None, nargs='?', -- help="Specify the test to run") -+# Only add the 'test' action if the test data files are available. -+if os.path.exists(func_test.TEST_DATA_DIR): -+ test_parser = subparsers.add_parser('test', help='Run tests') -+ test_parser.add_argument('testname', type=str, default=None, nargs='?', -+ help="Specify the test to run") - - status = subparsers.add_parser('status', - help='Check status of patches in patchwork') -@@ -113,7 +124,7 @@ status.add_argument('-f', '--force', action='store_true', - argv = sys.argv[1:] - args, rest = parser.parse_known_args(argv) - if hasattr(args, 'project'): -- settings.Setup(gitutil, parser, args.project, '') -+ settings.Setup(parser, args.project) - args, rest = parser.parse_known_args(argv) - - # If we have a command, it is safe to parse all arguments -@@ -160,11 +171,8 @@ elif args.cmd == 'send': - fd.close() - - elif args.full_help: -- tools.print_full_help( -- os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), -- 'README.rst') -- ) -- -+ with importlib.resources.path('patman', 'README.rst') as readme: -+ tools.print_full_help(str(readme)) - else: - # If we are not processing tags, no need to warning about bad ones - if not args.process_tags: -diff --git a/tools/patman/checkpatch.py b/tools/patman/checkpatch.py -index d1b902dd96..012c0d895c 100644 ---- a/tools/patman/checkpatch.py -+++ b/tools/patman/checkpatch.py -@@ -211,7 +211,7 @@ def check_patch(fname, verbose=False, show_types=False, use_tree=False): - stdout: Full output of checkpatch - """ - chk = find_check_patch() -- args = [chk] -+ args = [chk, '--u-boot', '--strict'] - if not use_tree: - args.append('--no-tree') - if show_types: -diff --git a/tools/patman/control.py b/tools/patman/control.py -index bf426cf7bc..38e98dab84 100644 ---- a/tools/patman/control.py -+++ b/tools/patman/control.py -@@ -94,8 +94,8 @@ def check_patches(series, patch_files, run_checkpatch, verbose, use_tree): - - - def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go, -- ignore_bad_tags, add_maintainers, limit, dry_run, in_reply_to, -- thread, smtp_server): -+ ignore_bad_tags, add_maintainers, get_maintainer_script, limit, -+ dry_run, in_reply_to, thread, smtp_server): - """Email patches to the recipients - - This emails out the patches and cover letter using 'git send-email'. Each -@@ -123,6 +123,8 @@ def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go, - ignore_bad_tags (bool): True to just print a warning for unknown tags, - False to halt with an error - add_maintainers (bool): Run the get_maintainer.pl script for each patch -+ get_maintainer_script (str): The script used to retrieve which -+ maintainers to cc - limit (int): Limit on the number of people that can be cc'd on a single - patch or the cover letter (None if no limit) - dry_run (bool): Don't actually email the patches, just print out what -@@ -134,7 +136,7 @@ def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go, - smtp_server (str): SMTP server to use to send patches (None for default) - """ - cc_file = series.MakeCcFile(process_tags, cover_fname, not ignore_bad_tags, -- add_maintainers, limit) -+ add_maintainers, limit, get_maintainer_script) - - # Email the patches out (giving the user time to check / cancel) - cmd = '' -@@ -174,8 +176,8 @@ def send(args): - email_patches( - col, series, cover_fname, patch_files, args.process_tags, - its_a_go, args.ignore_bad_tags, args.add_maintainers, -- args.limit, args.dry_run, args.in_reply_to, args.thread, -- args.smtp_server) -+ args.get_maintainer_script, args.limit, args.dry_run, -+ args.in_reply_to, args.thread, args.smtp_server) - - def patchwork_status(branch, count, start, end, dest_branch, force, - show_comments, url): -diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py -index 7b92bc67be..c25a47bdeb 100644 ---- a/tools/patman/func_test.py -+++ b/tools/patman/func_test.py -@@ -6,7 +6,9 @@ - - """Functional tests for checking that patman behaves correctly""" - -+import contextlib - import os -+import pathlib - import re - import shutil - import sys -@@ -28,6 +30,21 @@ from patman.test_util import capture_sys_output - import pygit2 - from patman import status - -+PATMAN_DIR = pathlib.Path(__file__).parent -+TEST_DATA_DIR = PATMAN_DIR / 'test/' -+ -+ -+@contextlib.contextmanager -+def directory_excursion(directory): -+ """Change directory to `directory` for a limited to the context block.""" -+ current = os.getcwd() -+ try: -+ os.chdir(directory) -+ yield -+ finally: -+ os.chdir(current) -+ -+ - class TestFunctional(unittest.TestCase): - """Functional tests for checking that patman behaves correctly""" - leb = (b'Lord Edmund Blackadd\xc3\xabr <weasel@blackadder.org>'. -@@ -57,8 +74,7 @@ class TestFunctional(unittest.TestCase): - Returns: - str: Full path to file in the test directory - """ -- return os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), -- 'test', fname) -+ return TEST_DATA_DIR / fname - - @classmethod - def _get_text(cls, fname): -@@ -200,6 +216,8 @@ class TestFunctional(unittest.TestCase): - text = self._get_text('test01.txt') - series = patchstream.get_metadata_for_test(text) - cover_fname, args = self._create_patches_for_test(series) -+ get_maintainer_script = str(pathlib.Path(__file__).parent.parent.parent -+ / 'get_maintainer.pl') + ' --norolestats' - with capture_sys_output() as out: - patchstream.fix_patches(series, args) - if cover_fname and series.get('cover'): -@@ -207,7 +225,7 @@ class TestFunctional(unittest.TestCase): - series.DoChecks() - cc_file = series.MakeCcFile(process_tags, cover_fname, - not ignore_bad_tags, add_maintainers, -- None) -+ None, get_maintainer_script) - cmd = gitutil.email_patches( - series, cover_fname, args, dry_run, not ignore_bad_tags, - cc_file, in_reply_to=in_reply_to, thread=None) -@@ -502,6 +520,37 @@ complicated as possible''') - finally: - os.chdir(orig_dir) - -+ def test_custom_get_maintainer_script(self): -+ """Validate that a custom get_maintainer script gets used.""" -+ self.make_git_tree() -+ with directory_excursion(self.gitdir): -+ # Setup git. -+ os.environ['GIT_CONFIG_GLOBAL'] = '/dev/null' -+ os.environ['GIT_CONFIG_SYSTEM'] = '/dev/null' -+ tools.run('git', 'config', 'user.name', 'Dummy') -+ tools.run('git', 'config', 'user.email', 'dumdum@dummy.com') -+ tools.run('git', 'branch', 'upstream') -+ tools.run('git', 'branch', '--set-upstream-to=upstream') -+ tools.run('git', 'add', '.') -+ tools.run('git', 'commit', '-m', 'new commit') -+ -+ # Setup patman configuration. -+ with open('.patman', 'w', buffering=1) as f: -+ f.write('[settings]\n' -+ 'get_maintainer_script: dummy-script.sh\n' -+ 'check_patch: False\n') -+ with open('dummy-script.sh', 'w', buffering=1) as f: -+ f.write('#!/usr/bin/env python\n' -+ 'print("hello@there.com")\n') -+ os.chmod('dummy-script.sh', 0x555) -+ -+ # Finally, do the test -+ with capture_sys_output(): -+ output = tools.run(PATMAN_DIR / 'patman', '--dry-run') -+ # Assert the email address is part of the dry-run -+ # output. -+ self.assertIn('hello@there.com', output) -+ - def test_tags(self): - """Test collection of tags in a patchstream""" - text = '''This is a patch -diff --git a/tools/patman/get_maintainer.py b/tools/patman/get_maintainer.py -index e1d15ff6ab..f7011be1e4 100644 ---- a/tools/patman/get_maintainer.py -+++ b/tools/patman/get_maintainer.py -@@ -1,48 +1,61 @@ - # SPDX-License-Identifier: GPL-2.0+ - # Copyright (c) 2012 The Chromium OS Authors. -+# Copyright (c) 2022 Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com> - # - - import os -+import shlex -+import shutil - - from patman import command -+from patman import gitutil - --def find_get_maintainer(try_list): -- """Look for the get_maintainer.pl script. - -- Args: -- try_list: List of directories to try for the get_maintainer.pl script -+def find_get_maintainer(script_file_name): -+ """Try to find where `script_file_name` is. - -- Returns: -- If the script is found we'll return a path to it; else None. -+ It searches in PATH and falls back to a path relative to the top -+ of the current git repository. - """ -- # Look in the list -- for path in try_list: -- fname = os.path.join(path, 'get_maintainer.pl') -- if os.path.isfile(fname): -- return fname -+ get_maintainer = shutil.which(script_file_name) -+ if get_maintainer: -+ return get_maintainer -+ -+ git_relative_script = os.path.join(gitutil.get_top_level(), -+ script_file_name) -+ if os.path.exists(git_relative_script): -+ return git_relative_script - -- return None - --def get_maintainer(dir_list, fname, verbose=False): -- """Run get_maintainer.pl on a file if we find it. -+def get_maintainer(script_file_name, fname, verbose=False): -+ """Run `script_file_name` on a file. - -- We look for get_maintainer.pl in the 'scripts' directory at the top of -- git. If we find it we'll run it. If we don't find get_maintainer.pl -- then we fail silently. -+ `script_file_name` should be a get_maintainer.pl-like script that -+ takes a patch file name as an input and return the email addresses -+ of the associated maintainers to standard output, one per line. -+ -+ If `script_file_name` does not exist we fail silently. - - Args: -- dir_list: List of directories to try for the get_maintainer.pl script -- fname: Path to the patch file to run get_maintainer.pl on. -+ script_file_name: The file name of the get_maintainer.pl script -+ (or compatible). -+ fname: File name of the patch to process with get_maintainer.pl. - - Returns: - A list of email addresses to CC to. - """ -- get_maintainer = find_get_maintainer(dir_list) -+ # Expand `script_file_name` into a file name and its arguments, if -+ # any. -+ cmd_args = shlex.split(script_file_name) -+ file_name = cmd_args[0] -+ arguments = cmd_args[1:] -+ -+ get_maintainer = find_get_maintainer(file_name) - if not get_maintainer: - if verbose: - print("WARNING: Couldn't find get_maintainer.pl") - return [] - -- stdout = command.output(get_maintainer, '--norolestats', fname) -+ stdout = command.output(get_maintainer, *arguments, fname) - lines = stdout.splitlines() -- return [ x.replace('"', '') for x in lines ] -+ return [x.replace('"', '') for x in lines] -diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py -index ceaf2ce150..5e742102c2 100644 ---- a/tools/patman/gitutil.py -+++ b/tools/patman/gitutil.py -@@ -2,21 +2,19 @@ - # Copyright (c) 2011 The Chromium OS Authors. - # - --import re - import os --import subprocess - import sys - - from patman import command - from patman import settings - from patman import terminal --from patman import tools - - # True to use --no-decorate - we check this in setup() - use_no_decorate = True - -+ - def log_cmd(commit_range, git_dir=None, oneline=False, reverse=False, -- count=None): -+ count=None): - """Create a command to perform a 'git log' - - Args: -@@ -49,6 +47,7 @@ def log_cmd(commit_range, git_dir=None, oneline=False, reverse=False, - cmd.append('--') - return cmd - -+ - def count_commits_to_branch(branch): - """Returns number of commits between HEAD and the tracking branch. - -@@ -68,13 +67,14 @@ def count_commits_to_branch(branch): - rev_range = '@{upstream}..' - pipe = [log_cmd(rev_range, oneline=True)] - result = command.run_pipe(pipe, capture=True, capture_stderr=True, -- oneline=True, raise_on_error=False) -+ oneline=True, raise_on_error=False) - if result.return_code: - raise ValueError('Failed to determine upstream: %s' % - result.stderr.strip()) - patch_count = len(result.stdout.splitlines()) - return patch_count - -+ - def name_revision(commit_hash): - """Gets the revision name for a commit - -@@ -91,6 +91,7 @@ def name_revision(commit_hash): - name = stdout.split(' ')[1].strip() - return name - -+ - def guess_upstream(git_dir, branch): - """Tries to guess the upstream for a branch - -@@ -109,7 +110,7 @@ def guess_upstream(git_dir, branch): - """ - pipe = [log_cmd(branch, git_dir=git_dir, oneline=True, count=100)] - result = command.run_pipe(pipe, capture=True, capture_stderr=True, -- raise_on_error=False) -+ raise_on_error=False) - if result.return_code: - return None, "Branch '%s' not found" % branch - for line in result.stdout.splitlines()[1:]: -@@ -121,6 +122,7 @@ def guess_upstream(git_dir, branch): - return name, "Guessing upstream as '%s'" % name - return None, "Cannot find a suitable upstream for branch '%s'" % branch - -+ - def get_upstream(git_dir, branch): - """Returns the name of the upstream for a branch - -@@ -135,10 +137,10 @@ def get_upstream(git_dir, branch): - """ - try: - remote = command.output_one_line('git', '--git-dir', git_dir, 'config', -- 'branch.%s.remote' % branch) -+ 'branch.%s.remote' % branch) - merge = command.output_one_line('git', '--git-dir', git_dir, 'config', -- 'branch.%s.merge' % branch) -- except: -+ 'branch.%s.merge' % branch) -+ except Exception: - upstream, msg = guess_upstream(git_dir, branch) - return upstream, msg - -@@ -149,7 +151,8 @@ def get_upstream(git_dir, branch): - return '%s/%s' % (remote, leaf), None - else: - raise ValueError("Cannot determine upstream branch for branch " -- "'%s' remote='%s', merge='%s'" % (branch, remote, merge)) -+ "'%s' remote='%s', merge='%s'" -+ % (branch, remote, merge)) - - - def get_range_in_branch(git_dir, branch, include_upstream=False): -@@ -168,6 +171,7 @@ def get_range_in_branch(git_dir, branch, include_upstream=False): - rstr = '%s%s..%s' % (upstream, '~' if include_upstream else '', branch) - return rstr, msg - -+ - def count_commits_in_range(git_dir, range_expr): - """Returns the number of commits in the given range. - -@@ -180,12 +184,13 @@ def count_commits_in_range(git_dir, range_expr): - """ - pipe = [log_cmd(range_expr, git_dir=git_dir, oneline=True)] - result = command.run_pipe(pipe, capture=True, capture_stderr=True, -- raise_on_error=False) -+ raise_on_error=False) - if result.return_code: - return None, "Range '%s' not found or is invalid" % range_expr - patch_count = len(result.stdout.splitlines()) - return patch_count, None - -+ - def count_commits_in_branch(git_dir, branch, include_upstream=False): - """Returns the number of commits in the given branch. - -@@ -201,6 +206,7 @@ def count_commits_in_branch(git_dir, branch, include_upstream=False): - return None, msg - return count_commits_in_range(git_dir, range_expr) - -+ - def count_commits(commit_range): - """Returns the number of commits in the given range. - -@@ -215,6 +221,7 @@ def count_commits(commit_range): - patch_count = int(stdout) - return patch_count - -+ - def checkout(commit_hash, git_dir=None, work_tree=None, force=False): - """Checkout the selected commit for this build - -@@ -231,10 +238,11 @@ def checkout(commit_hash, git_dir=None, work_tree=None, force=False): - pipe.append('-f') - pipe.append(commit_hash) - result = command.run_pipe([pipe], capture=True, raise_on_error=False, -- capture_stderr=True) -+ capture_stderr=True) - if result.return_code != 0: - raise OSError('git checkout (%s): %s' % (pipe, result.stderr)) - -+ - def clone(git_dir, output_dir): - """Checkout the selected commit for this build - -@@ -243,10 +251,11 @@ def clone(git_dir, output_dir): - """ - pipe = ['git', 'clone', git_dir, '.'] - result = command.run_pipe([pipe], capture=True, cwd=output_dir, -- capture_stderr=True) -+ capture_stderr=True) - if result.return_code != 0: - raise OSError('git clone: %s' % result.stderr) - -+ - def fetch(git_dir=None, work_tree=None): - """Fetch from the origin repo - -@@ -263,6 +272,7 @@ def fetch(git_dir=None, work_tree=None): - if result.return_code != 0: - raise OSError('git fetch: %s' % result.stderr) - -+ - def check_worktree_is_available(git_dir): - """Check if git-worktree functionality is available - -@@ -274,9 +284,10 @@ def check_worktree_is_available(git_dir): - """ - pipe = ['git', '--git-dir', git_dir, 'worktree', 'list'] - result = command.run_pipe([pipe], capture=True, capture_stderr=True, -- raise_on_error=False) -+ raise_on_error=False) - return result.return_code == 0 - -+ - def add_worktree(git_dir, output_dir, commit_hash=None): - """Create and checkout a new git worktree for this build - -@@ -290,10 +301,11 @@ def add_worktree(git_dir, output_dir, commit_hash=None): - if commit_hash: - pipe.append(commit_hash) - result = command.run_pipe([pipe], capture=True, cwd=output_dir, -- capture_stderr=True) -+ capture_stderr=True) - if result.return_code != 0: - raise OSError('git worktree add: %s' % result.stderr) - -+ - def prune_worktrees(git_dir): - """Remove administrative files for deleted worktrees - -@@ -305,7 +317,8 @@ def prune_worktrees(git_dir): - if result.return_code != 0: - raise OSError('git worktree prune: %s' % result.stderr) - --def create_patches(branch, start, count, ignore_binary, series, signoff = True): -+ -+def create_patches(branch, start, count, ignore_binary, series, signoff=True): - """Create a series of patches from the top of the current branch. - - The patch files are written to the current directory using -@@ -321,9 +334,7 @@ def create_patches(branch, start, count, ignore_binary, series, signoff = True): - Filename of cover letter (None if none) - List of filenames of patch files - """ -- if series.get('version'): -- version = '%s ' % series['version'] -- cmd = ['git', 'format-patch', '-M' ] -+ cmd = ['git', 'format-patch', '-M'] - if signoff: - cmd.append('--signoff') - if ignore_binary: -@@ -341,9 +352,10 @@ def create_patches(branch, start, count, ignore_binary, series, signoff = True): - - # We have an extra file if there is a cover letter - if series.get('cover'): -- return files[0], files[1:] -+ return files[0], files[1:] - else: -- return None, files -+ return None, files -+ - - def build_email_list(in_list, tag=None, alias=None, warn_on_error=True): - """Build a list of email addresses based on an input list. -@@ -385,40 +397,43 @@ def build_email_list(in_list, tag=None, alias=None, warn_on_error=True): - raw += lookup_email(item, alias, warn_on_error=warn_on_error) - result = [] - for item in raw: -- if not item in result: -+ if item not in result: - result.append(item) - if tag: - return ['%s %s%s%s' % (tag, quote, email, quote) for email in result] - return result - -+ - def check_suppress_cc_config(): - """Check if sendemail.suppresscc is configured correctly. - - Returns: - True if the option is configured correctly, False otherwise. - """ -- suppresscc = command.output_one_line('git', 'config', 'sendemail.suppresscc', -- raise_on_error=False) -+ suppresscc = command.output_one_line( -+ 'git', 'config', 'sendemail.suppresscc', raise_on_error=False) - - # Other settings should be fine. - if suppresscc == 'all' or suppresscc == 'cccmd': - col = terminal.Color() - - print((col.build(col.RED, "error") + -- ": git config sendemail.suppresscc set to %s\n" % (suppresscc)) + -- " patman needs --cc-cmd to be run to set the cc list.\n" + -- " Please run:\n" + -- " git config --unset sendemail.suppresscc\n" + -- " Or read the man page:\n" + -- " git send-email --help\n" + -- " and set an option that runs --cc-cmd\n") -+ ": git config sendemail.suppresscc set to %s\n" -+ % (suppresscc)) + -+ " patman needs --cc-cmd to be run to set the cc list.\n" + -+ " Please run:\n" + -+ " git config --unset sendemail.suppresscc\n" + -+ " Or read the man page:\n" + -+ " git send-email --help\n" + -+ " and set an option that runs --cc-cmd\n") - return False - - return True - -+ - def email_patches(series, cover_fname, args, dry_run, warn_on_error, cc_fname, -- self_only=False, alias=None, in_reply_to=None, thread=False, -- smtp_server=None): -+ self_only=False, alias=None, in_reply_to=None, thread=False, -+ smtp_server=None, get_maintainer_script=None): - """Email a patch series. - - Args: -@@ -435,6 +450,7 @@ def email_patches(series, cover_fname, args, dry_run, warn_on_error, cc_fname, - thread: True to add --thread to git send-email (make - all patches reply to cover-letter or first patch in series) - smtp_server: SMTP server to use to send patches -+ get_maintainer_script: File name of script to get maintainers emails - - Returns: - Git command that was/would be run -@@ -487,9 +503,10 @@ send --cc-cmd cc-fname" cover p1 p2' - "git config sendemail.to u-boot@lists.denx.de") - return - cc = build_email_list(list(set(series.get('cc')) - set(series.get('to'))), -- '--cc', alias, warn_on_error) -+ '--cc', alias, warn_on_error) - if self_only: -- to = build_email_list([os.getenv('USER')], '--to', alias, warn_on_error) -+ to = build_email_list([os.getenv('USER')], '--to', -+ alias, warn_on_error) - cc = [] - cmd = ['git', 'send-email', '--annotate'] - if smtp_server: -@@ -565,7 +582,7 @@ def lookup_email(lookup_name, alias=None, warn_on_error=True, level=0): - if not alias: - alias = settings.alias - lookup_name = lookup_name.strip() -- if '@' in lookup_name: # Perhaps a real email address -+ if '@' in lookup_name: # Perhaps a real email address - return [lookup_name] - - lookup_name = lookup_name.lower() -@@ -581,7 +598,7 @@ def lookup_email(lookup_name, alias=None, warn_on_error=True, level=0): - return out_list - - if lookup_name: -- if not lookup_name in alias: -+ if lookup_name not in alias: - msg = "Alias '%s' not found" % lookup_name - if warn_on_error: - print(col.build(col.RED, msg)) -@@ -589,11 +606,12 @@ def lookup_email(lookup_name, alias=None, warn_on_error=True, level=0): - for item in alias[lookup_name]: - todo = lookup_email(item, alias, warn_on_error, level + 1) - for new_item in todo: -- if not new_item in out_list: -+ if new_item not in out_list: - out_list.append(new_item) - - return out_list - -+ - def get_top_level(): - """Return name of top-level directory for this git repo. - -@@ -608,6 +626,7 @@ def get_top_level(): - """ - return command.output_one_line('git', 'rev-parse', '--show-toplevel') - -+ - def get_alias_file(): - """Gets the name of the git alias file. - -@@ -615,7 +634,7 @@ def get_alias_file(): - Filename of git alias file, or None if none - """ - fname = command.output_one_line('git', 'config', 'sendemail.aliasesfile', -- raise_on_error=False) -+ raise_on_error=False) - if not fname: - return None - -@@ -625,6 +644,7 @@ def get_alias_file(): - - return os.path.join(get_top_level(), fname) - -+ - def get_default_user_name(): - """Gets the user.name from .gitconfig file. - -@@ -634,6 +654,7 @@ def get_default_user_name(): - uname = command.output_one_line('git', 'config', '--global', 'user.name') - return uname - -+ - def get_default_user_email(): - """Gets the user.email from the global .gitconfig file. - -@@ -643,17 +664,19 @@ def get_default_user_email(): - uemail = command.output_one_line('git', 'config', '--global', 'user.email') - return uemail - -+ - def get_default_subject_prefix(): - """Gets the format.subjectprefix from local .git/config file. - - Returns: - Subject prefix found in local .git/config file, or None if none - """ -- sub_prefix = command.output_one_line('git', 'config', 'format.subjectprefix', -- raise_on_error=False) -+ sub_prefix = command.output_one_line( -+ 'git', 'config', 'format.subjectprefix', raise_on_error=False) - - return sub_prefix - -+ - def setup(): - """Set up git utils, by reading the alias files.""" - # Check for a git alias file also -@@ -666,6 +689,7 @@ def setup(): - use_no_decorate = (command.run_pipe([cmd], raise_on_error=False) - .return_code == 0) - -+ - def get_head(): - """Get the hash of the current HEAD - -@@ -674,6 +698,7 @@ def get_head(): - """ - return command.output_one_line('git', 'show', '-s', '--pretty=format:%H') - -+ - if __name__ == "__main__": - import doctest - -diff --git a/tools/patman/patman b/tools/patman/patman -index 11a5d8e18a..5a427d1942 120000 ---- a/tools/patman/patman -+++ b/tools/patman/patman -@@ -1 +1 @@ --main.py -\ No newline at end of file -+__main__.py -\ No newline at end of file -diff --git a/tools/patman/patman.rst b/tools/patman/patman.rst -index 8c5c9cc2cc..6113962fb4 100644 ---- a/tools/patman/patman.rst -+++ b/tools/patman/patman.rst -@@ -1,6 +1,7 @@ - .. SPDX-License-Identifier: GPL-2.0+ - .. Copyright (c) 2011 The Chromium OS Authors - .. Simon Glass <sjg@chromium.org> -+.. Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com> - .. v1, v2, 19-Oct-11 - .. revised v3 24-Nov-11 - .. revised v4 Independence Day 2020, with Patchwork integration -@@ -68,13 +69,28 @@ this once:: - - git config sendemail.aliasesfile doc/git-mailrc - --For both Linux and U-Boot the 'scripts/get_maintainer.pl' handles figuring --out where to send patches pretty well. -+For both Linux and U-Boot the 'scripts/get_maintainer.pl' handles -+figuring out where to send patches pretty well. For other projects, -+you may want to specify a different script to be run, for example via -+a project-specific `.patman` file:: -+ -+ # .patman configuration file at the root of some project -+ -+ [settings] -+ get_maintainer_script: etc/teams.scm get-maintainer -+ -+The `get_maintainer_script` option corresponds to the -+`--get-maintainer-script` argument of the `send` command. It is -+looked relatively to the root of the current git repository, as well -+as on PATH. It can also be provided arguments, as shown above. The -+contract is that the script should accept a patch file name and return -+a list of email addresses, one per line, like `get_maintainer.pl` -+does. - - During the first run patman creates a config file for you by taking the default - user name and email address from the global .gitconfig file. - --To add your own, create a file ~/.patman like this:: -+To add your own, create a file `~/.patman` like this:: - - # patman alias file - -@@ -85,6 +101,12 @@ To add your own, create a file ~/.patman like this:: - wolfgang: Wolfgang Denk <wd@denx.de> - others: Mike Frysinger <vapier@gentoo.org>, Fred Bloggs <f.bloggs@napier.net> - -+As hinted above, Patman will also look for a `.patman` configuration -+file at the root of the current project git repository, which makes it -+possible to override the `project` settings variable or anything else -+in a project-specific way. The values of this "local" configuration -+file take precedence over those of the "global" one. -+ - Aliases are recursive. - - The checkpatch.pl in the U-Boot tools/ subdirectory will be located and -@@ -680,6 +702,16 @@ them: - - $ tools/patman/patman test - -+Note that since the test suite depends on data files only available in -+the git checkout, the `test` command is hidden unless `patman` is -+invoked from the U-Boot git repository. -+ -+Alternatively, you can run the test suite via Pytest: -+ -+.. code-block:: bash -+ -+ $ cd tools/patman && pytest -+ - Error handling doesn't always produce friendly error messages - e.g. - putting an incorrect tag in a commit may provide a confusing message. - -diff --git a/tools/patman/pytest.ini b/tools/patman/pytest.ini -new file mode 100644 -index 0000000000..df3eb518d0 ---- /dev/null -+++ b/tools/patman/pytest.ini -@@ -0,0 +1,2 @@ -+[pytest] -+addopts = --doctest-modules -diff --git a/tools/patman/series.py b/tools/patman/series.py -index 3075378ac1..2eeeef71dc 100644 ---- a/tools/patman/series.py -+++ b/tools/patman/series.py -@@ -235,7 +235,7 @@ class Series(dict): - print(col.build(col.RED, str)) - - def MakeCcFile(self, process_tags, cover_fname, warn_on_error, -- add_maintainers, limit): -+ add_maintainers, limit, get_maintainer_script): - """Make a cc file for us to use for per-commit Cc automation - - Also stores in self._generated_cc to make ShowActions() faster. -@@ -249,6 +249,8 @@ class Series(dict): - True/False to call the get_maintainers to CC maintainers - List of maintainers to include (for testing) - limit: Limit the length of the Cc list (None if no limit) -+ get_maintainer_script: The file name of the get_maintainer.pl -+ script (or compatible). - Return: - Filename of temp file created - """ -@@ -267,8 +269,9 @@ class Series(dict): - if type(add_maintainers) == type(cc): - cc += add_maintainers - elif add_maintainers: -- dir_list = [os.path.join(gitutil.get_top_level(), 'scripts')] -- cc += get_maintainer.get_maintainer(dir_list, commit.patch) -+ -+ cc += get_maintainer.get_maintainer(get_maintainer_script, -+ commit.patch) - for x in set(cc) & set(settings.bounces): - print(col.build(col.YELLOW, 'Skipping "%s"' % x)) - cc = list(set(cc) - set(settings.bounces)) -diff --git a/tools/patman/settings.py b/tools/patman/settings.py -index 903d6fcb0b..636983e32d 100644 ---- a/tools/patman/settings.py -+++ b/tools/patman/settings.py -@@ -1,18 +1,18 @@ - # SPDX-License-Identifier: GPL-2.0+ - # Copyright (c) 2011 The Chromium OS Authors. -+# Copyright (c) 2022 Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com> - # - - try: - import configparser as ConfigParser --except: -+except Exception: - import ConfigParser - - import argparse - import os - import re - --from patman import command --from patman import tools -+from patman import gitutil - - """Default settings per-project. - -@@ -32,7 +32,8 @@ _default_settings = { - }, - } - --class _ProjectConfigParser(ConfigParser.SafeConfigParser): -+ -+class _ProjectConfigParser(ConfigParser.ConfigParser): - """ConfigParser that handles projects. - - There are two main goals of this class: -@@ -83,14 +84,14 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser): - def __init__(self, project_name): - """Construct _ProjectConfigParser. - -- In addition to standard SafeConfigParser initialization, this also loads -- project defaults. -+ In addition to standard ConfigParser initialization, this also -+ loads project defaults. - - Args: - project_name: The name of the project. - """ - self._project_name = project_name -- ConfigParser.SafeConfigParser.__init__(self) -+ ConfigParser.ConfigParser.__init__(self) - - # Update the project settings in the config based on - # the _default_settings global. -@@ -102,31 +103,31 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser): - self.set(project_settings, setting_name, setting_value) - - def get(self, section, option, *args, **kwargs): -- """Extend SafeConfigParser to try project_section before section. -+ """Extend ConfigParser to try project_section before section. - - Args: -- See SafeConfigParser. -+ See ConfigParser. - Returns: -- See SafeConfigParser. -+ See ConfigParser. - """ - try: -- val = ConfigParser.SafeConfigParser.get( -+ val = ConfigParser.ConfigParser.get( - self, "%s_%s" % (self._project_name, section), option, - *args, **kwargs - ) - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): -- val = ConfigParser.SafeConfigParser.get( -+ val = ConfigParser.ConfigParser.get( - self, section, option, *args, **kwargs - ) - return val - - def items(self, section, *args, **kwargs): -- """Extend SafeConfigParser to add project_section to section. -+ """Extend ConfigParser to add project_section to section. - - Args: -- See SafeConfigParser. -+ See ConfigParser. - Returns: -- See SafeConfigParser. -+ See ConfigParser. - """ - project_items = [] - has_project_section = False -@@ -134,7 +135,7 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser): - - # Get items from the project section - try: -- project_items = ConfigParser.SafeConfigParser.items( -+ project_items = ConfigParser.ConfigParser.items( - self, "%s_%s" % (self._project_name, section), *args, **kwargs - ) - has_project_section = True -@@ -143,7 +144,7 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser): - - # Get top-level items - try: -- top_items = ConfigParser.SafeConfigParser.items( -+ top_items = ConfigParser.ConfigParser.items( - self, section, *args, **kwargs - ) - except ConfigParser.NoSectionError: -@@ -155,6 +156,7 @@ class _ProjectConfigParser(ConfigParser.SafeConfigParser): - item_dict.update(project_items) - return {(item, val) for item, val in item_dict.items()} - -+ - def ReadGitAliases(fname): - """Read a git alias file. This is in the form used by git: - -@@ -170,7 +172,7 @@ def ReadGitAliases(fname): - print("Warning: Cannot find alias file '%s'" % fname) - return - -- re_line = re.compile('alias\s+(\S+)\s+(.*)') -+ re_line = re.compile(r'alias\s+(\S+)\s+(.*)') - for line in fd.readlines(): - line = line.strip() - if not line or line[0] == '#': -@@ -190,7 +192,8 @@ def ReadGitAliases(fname): - - fd.close() - --def CreatePatmanConfigFile(gitutil, config_fname): -+ -+def CreatePatmanConfigFile(config_fname): - """Creates a config file under $(HOME)/.patman if it can't find one. - - Args: -@@ -200,12 +203,12 @@ def CreatePatmanConfigFile(gitutil, config_fname): - None - """ - name = gitutil.get_default_user_name() -- if name == None: -+ if name is None: - name = input("Enter name: ") - - email = gitutil.get_default_user_email() - -- if email == None: -+ if email is None: - email = input("Enter email: ") - - try: -@@ -220,7 +223,8 @@ me: %s <%s> - [bounces] - nxp = Zhikang Zhang <zhikang.zhang@nxp.com> - ''' % (name, email), file=f) -- f.close(); -+ f.close() -+ - - def _UpdateDefaults(main_parser, config): - """Update the given OptionParser defaults based on config. -@@ -242,8 +246,8 @@ def _UpdateDefaults(main_parser, config): - # Find all the parsers and subparsers - parsers = [main_parser] - parsers += [subparser for action in main_parser._actions -- if isinstance(action, argparse._SubParsersAction) -- for _, subparser in action.choices.items()] -+ if isinstance(action, argparse._SubParsersAction) -+ for _, subparser in action.choices.items()] - - # Collect the defaults from each parser - defaults = {} -@@ -270,8 +274,9 @@ def _UpdateDefaults(main_parser, config): - # Set all the defaults and manually propagate them to subparsers - main_parser.set_defaults(**defaults) - for parser, pdefs in zip(parsers, parser_defaults): -- parser.set_defaults(**{ k: v for k, v in defaults.items() -- if k in pdefs }) -+ parser.set_defaults(**{k: v for k, v in defaults.items() -+ if k in pdefs}) -+ - - def _ReadAliasFile(fname): - """Read in the U-Boot git alias file if it exists. -@@ -298,6 +303,7 @@ def _ReadAliasFile(fname): - if bad_line: - print(bad_line) - -+ - def _ReadBouncesFile(fname): - """Read in the bounces file if it exists - -@@ -311,6 +317,7 @@ def _ReadBouncesFile(fname): - continue - bounces.add(line.strip()) - -+ - def GetItems(config, section): - """Get the items from a section of the config. - -@@ -323,31 +330,50 @@ def GetItems(config, section): - """ - try: - return config.items(section) -- except ConfigParser.NoSectionError as e: -+ except ConfigParser.NoSectionError: - return [] -- except: -- raise - --def Setup(gitutil, parser, project_name, config_fname=''): -+ -+def Setup(parser, project_name, config_fname=None): - """Set up the settings module by reading config files. - -+ Unless `config_fname` is specified, a `.patman` config file local -+ to the git repository is consulted, followed by the global -+ `$HOME/.patman`. If none exists, the later is created. Values -+ defined in the local config file take precedence over those -+ defined in the global one. -+ - Args: -- parser: The parser to update -+ parser: The parser to update. - project_name: Name of project that we're working on; we'll look - for sections named "project_section" as well. -- config_fname: Config filename to read ('' for default) -+ config_fname: Config filename to read. An error is raised if it -+ does not exist. - """ - # First read the git alias file if available - _ReadAliasFile('doc/git-mailrc') - config = _ProjectConfigParser(project_name) -- if config_fname == '': -+ -+ if config_fname and not os.path.exists(config_fname): -+ raise Exception(f'provided {config_fname} does not exist') -+ -+ if not config_fname: - config_fname = '%s/.patman' % os.getenv('HOME') -+ has_config = os.path.exists(config_fname) -+ -+ git_local_config_fname = os.path.join(gitutil.get_top_level(), '.patman') -+ has_git_local_config = os.path.exists(git_local_config_fname) - -- if not os.path.exists(config_fname): -- print("No config file found ~/.patman\nCreating one...\n") -- CreatePatmanConfigFile(gitutil, config_fname) -+ # Read the git local config last, so that its values override -+ # those of the global config, if any. -+ if has_config: -+ config.read(config_fname) -+ if has_git_local_config: -+ config.read(git_local_config_fname) - -- config.read(config_fname) -+ if not (has_config or has_git_local_config): -+ print("No config file found.\nCreating ~/.patman...\n") -+ CreatePatmanConfigFile(config_fname) - - for name, value in GetItems(config, 'alias'): - alias[name] = value.split(',') -@@ -358,6 +384,7 @@ def Setup(gitutil, parser, project_name, config_fname=''): - - _UpdateDefaults(parser, config) - -+ - # These are the aliases we understand, indexed by alias. Each member is a list. - alias = {} - bounces = set() -diff --git a/tools/patman/setup.py b/tools/patman/setup.py -index 5643bf1503..2ff791da0f 100644 ---- a/tools/patman/setup.py -+++ b/tools/patman/setup.py -@@ -7,6 +7,6 @@ setup(name='patman', - scripts=['patman'], - packages=['patman'], - package_dir={'patman': ''}, -- package_data={'patman': ['README']}, -+ package_data={'patman': ['README.rst']}, - classifiers=['Environment :: Console', - 'Topic :: Software Development']) -diff --git a/tools/patman/test_settings.py b/tools/patman/test_settings.py -new file mode 100644 -index 0000000000..c768a2fc64 ---- /dev/null -+++ b/tools/patman/test_settings.py -@@ -0,0 +1,67 @@ -+# SPDX-License-Identifier: GPL-2.0+ -+# -+# Copyright (c) 2022 Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com> -+# -+ -+import argparse -+import contextlib -+import os -+import sys -+import tempfile -+ -+from patman import settings -+from patman import tools -+ -+ -+@contextlib.contextmanager -+def empty_git_repository(): -+ with tempfile.TemporaryDirectory() as tmpdir: -+ os.chdir(tmpdir) -+ tools.run('git', 'init', raise_on_error=True) -+ yield tmpdir -+ -+ -+@contextlib.contextmanager -+def cleared_command_line_args(): -+ old_value = sys.argv[:] -+ sys.argv = [sys.argv[0]] -+ try: -+ yield -+ finally: -+ sys.argv = old_value -+ -+ -+def test_git_local_config(): -+ # Clearing the command line arguments is required, otherwise -+ # arguments passed to the test running such as in 'pytest -k -+ # filter' would be processed by _UpdateDefaults and fail. -+ with cleared_command_line_args(): -+ with empty_git_repository(): -+ with tempfile.NamedTemporaryFile() as global_config: -+ global_config.write(b'[settings]\n' -+ b'project=u-boot\n') -+ global_config.flush() -+ parser = argparse.ArgumentParser() -+ parser.add_argument('-p', '--project', default='unknown') -+ subparsers = parser.add_subparsers(dest='cmd') -+ send = subparsers.add_parser('send') -+ send.add_argument('--no-check', action='store_false', -+ dest='check_patch', default=True) -+ -+ # Test "global" config is used. -+ settings.Setup(parser, 'unknown', global_config.name) -+ args, _ = parser.parse_known_args([]) -+ assert args.project == 'u-boot' -+ send_args, _ = send.parse_known_args([]) -+ assert send_args.check_patch -+ -+ # Test local config can shadow it. -+ with open('.patman', 'w', buffering=1) as f: -+ f.write('[settings]\n' -+ 'project: guix-patches\n' -+ 'check_patch: False\n') -+ settings.Setup(parser, 'unknown', global_config.name) -+ args, _ = parser.parse_known_args([]) -+ assert args.project == 'guix-patches' -+ send_args, _ = send.parse_known_args([]) -+ assert not send_args.check_patch diff --git a/gnu/packages/patches/u-boot-sifive-prevent-reloc-initrd-fdt.patch b/gnu/packages/patches/u-boot-sifive-prevent-reloc-initrd-fdt.patch index a5b92e3e8f..858f42efe7 100644 --- a/gnu/packages/patches/u-boot-sifive-prevent-reloc-initrd-fdt.patch +++ b/gnu/packages/patches/u-boot-sifive-prevent-reloc-initrd-fdt.patch @@ -5,12 +5,12 @@ Index: u-boot-2021.07~rc4+dfsg/include/configs/sifive-unmatched.h =================================================================== --- u-boot-2021.07~rc4+dfsg.orig/include/configs/sifive-unmatched.h +++ u-boot-2021.07~rc4+dfsg/include/configs/sifive-unmatched.h -@@ -62,6 +62,8 @@ +@@ -55,6 +55,8 @@ "name=system,size=-,bootable,type=${type_guid_gpt_system};" - #define CONFIG_EXTRA_ENV_SETTINGS \ + #define CFG_EXTRA_ENV_SETTINGS \ + "fdt_high=0xffffffffffffffff\0" \ + "initrd_high=0xffffffffffffffff\0" \ "kernel_addr_r=0x84000000\0" \ - "fdt_addr_r=0x88000000\0" \ - "scriptaddr=0x88100000\0" \ + "kernel_comp_addr_r=0x88000000\0" \ + "kernel_comp_size=0x4000000\0" \ diff --git a/gnu/packages/patches/zig-0.9-riscv-support.patch b/gnu/packages/patches/zig-0.9-riscv-support.patch new file mode 100644 index 0000000000..372a68ea02 --- /dev/null +++ b/gnu/packages/patches/zig-0.9-riscv-support.patch @@ -0,0 +1,47 @@ +https://github.com/ziglang/zig/commit/ca3c4ff2d0afcdc8fe86e7e7b41a967c88779729 +From: Shupei Fan <dymarkfan@outlook.com> +zig0: properly set llvm_cpu_names and llvm_cpu_features for riscv + +Bug: https://bugs.gentoo.org/851732 + +--- a/src/stage1/zig0.cpp ++++ b/src/stage1/zig0.cpp +@@ -160,6 +160,17 @@ static void get_native_target(ZigTarget *target) { + } + } + ++static const char* get_baseline_llvm_cpu_name(ZigLLVM_ArchType arch) { ++ return ""; ++} ++ ++static const char* get_baseline_llvm_cpu_features(ZigLLVM_ArchType arch) { ++ switch (arch) { ++ case ZigLLVM_riscv64: return "+a,+c,+d,+m"; ++ default: return ""; ++ } ++} ++ + static Error target_parse_triple(struct ZigTarget *target, const char *zig_triple, const char *mcpu, + const char *dynamic_linker) + { +@@ -178,8 +189,8 @@ static Error target_parse_triple(struct ZigTarget *target, const char *zig_tripl + } else if (strcmp(mcpu, "baseline") == 0) { + target->is_native_os = false; + target->is_native_cpu = false; +- target->llvm_cpu_name = ""; +- target->llvm_cpu_features = ""; ++ target->llvm_cpu_name = get_baseline_llvm_cpu_name(target->arch); ++ target->llvm_cpu_features = get_baseline_llvm_cpu_features(target->arch); + } else { + const char *msg = "stage0 can't handle CPU/features in the target"; + stage2_panic(msg, strlen(msg)); +@@ -220,6 +231,9 @@ static Error target_parse_triple(struct ZigTarget *target, const char *zig_tripl + const char *msg = "stage0 can't handle CPU/features in the target"; + stage2_panic(msg, strlen(msg)); + } ++ ++ target->llvm_cpu_name = get_baseline_llvm_cpu_name(target->arch); ++ target->llvm_cpu_features = get_baseline_llvm_cpu_features(target->arch); + } + + return ErrorNone; |