mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-29 18:00:18 +00:00
Rocky Linux kernel rebuilds can append an extra release suffix to the
source RPM name. For example, kernel-5.14.0-687.10.1.el9_8.0.1.src.rpm can
still contain a linux-5.14.0-687.10.1.el9_8.tar.* source archive.
The exact linux-${kver}*.tar.* match then fails before the source tree
can be extracted.
Look for the archive name again with a trailing .0.N rebuild suffix
removed and keep renaming the extracted tree to the full requested kernel
release, so later paths remain unchanged.
978 lines
33 KiB
Bash
978 lines
33 KiB
Bash
#!/bin/bash
|
|
# Shell functions for parsing the Linux kernel version and for downloading
|
|
# from kernel.org.
|
|
|
|
# shellcheck source=./rhel-rpm-functions
|
|
source "$(dirname "$0")/../scripts/rhel-rpm-functions" || return $?
|
|
|
|
kernel_mirror="http://cdn.kernel.org/pub/linux/kernel"
|
|
kernel_downloads="$HOME/software/downloads"
|
|
kernel_tree="$HOME/software/linux-kernel"
|
|
|
|
# Whether or not kernel version $1 is lower than or equal kernel version $2.
|
|
function kernel_version_le {
|
|
awk -v "v1=$1" -v "v2=$2" 'BEGIN { n1 = split(v1, v1a, "."); n2 = split(v2, v2a, "."); for (i=1;;i++) { e1 = i <= n1 ? v1a[i] : 0; e2 = i <= n2 ? v2a[i] : 0; if (e1 < e2 || i > n1 && i > n2) exit 0; if (e1 > e2) exit 1; }}'
|
|
}
|
|
|
|
function kernel_version_lt {
|
|
[ "$1" != "$2" ] && kernel_version_le "$1" "$2"
|
|
}
|
|
|
|
# Kernel version number.
|
|
function kernel_version {
|
|
if [ "${1#2.}" != "$1" ]; then
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/p'
|
|
else
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\).*$/\1/p'
|
|
fi
|
|
}
|
|
|
|
# Last component of the kernel version, or the empty string if $1 does
|
|
# not contain a patchlevel.
|
|
function patchlevel {
|
|
if [ "${1#2.}" != "$1" ]; then
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p'
|
|
else
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p'
|
|
fi
|
|
}
|
|
|
|
# Download the file from URL $1 and save it in the current directory.
|
|
function download_file {
|
|
if [ ! -e "$(basename "$1")" ]; then
|
|
if [ "${quiet_download}" = "false" ]; then
|
|
{ wget -q -nc -O- "$1" 2>/dev/null | grep -q .; } \
|
|
&& echo "Downloading $1 ..."
|
|
fi
|
|
wget -q -nc "$1"
|
|
fi
|
|
[ -e "$(basename "$1")" ]
|
|
}
|
|
|
|
# Make sure the kernel tarball and patch file are present in directory
|
|
# ${kernel_downloads}. Download any missing files from ${kernel_mirror}.
|
|
function download_kernel {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local series="$1"
|
|
|
|
case "${series:0:2}" in
|
|
[12].*) series="${series:0:3}";;
|
|
*) series="${series/.*/}.x";;
|
|
esac
|
|
|
|
mkdir -p "${kernel_downloads}" || return $?
|
|
|
|
test -w "${kernel_downloads}" || return $?
|
|
(
|
|
cd "${kernel_downloads}" || return $?
|
|
if [ "$plevel" = "" ] || [ "$plevel" = "0" ] ||
|
|
download_file "${kernel_mirror}/v$series/patch-$1.xz"
|
|
then
|
|
download_file "${kernel_mirror}/v$series/linux-${kver}.tar.xz" ||
|
|
return $?
|
|
else
|
|
download_file "${kernel_mirror}/v$series/linux-$1.tar.xz" ||
|
|
return $?
|
|
fi
|
|
)
|
|
}
|
|
|
|
function extract_kernel_archive {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local series="$1"
|
|
|
|
if [ -e "${kernel_downloads}/linux-$1.tar.xz" ]; then
|
|
xz -cd "${kernel_downloads}/linux-$1.tar.xz" | tar xf -
|
|
elif [ -e "${kernel_downloads}/linux-$kver.tar.xz" ]; then
|
|
xz -cd "${kernel_downloads}/linux-$kver.tar.xz" | tar xf - &&
|
|
mv "linux-$kver" "linux-$1"
|
|
elif [ -e "${kernel_downloads}/linux-$1.tar.bz2" ]; then
|
|
tar xjf "${kernel_downloads}/linux-$1.tar.bz2"
|
|
elif [ -e "${kernel_downloads}/linux-$kver.tar.bz2" ]; then
|
|
tar xjf "${kernel_downloads}/linux-$kver.tar.bz2" &&
|
|
mv "linux-$kver" "linux-$1"
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Create a linux-$1 tree in the current directory, where $1 is a kernel
|
|
# version number with either three or four components.
|
|
function extract_kernel_tree {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local tmpdir=kernel-tree-tmp-$$
|
|
|
|
rm -rf "linux-$1" "${tmpdir}"
|
|
mkdir "${tmpdir}" || return $?
|
|
(
|
|
cd "${tmpdir}" || return $?
|
|
if [ "$plevel" != "" ] && [ "$plevel" != "0" ] &&
|
|
[ -e "${kernel_downloads}/patch-$1.xz" ]; then
|
|
extract_kernel_archive "$kver" || return $?
|
|
mv "linux-$kver" "linux-$1"
|
|
( cd "linux-$1" && xz -cd "${kernel_downloads}/patch-$1.xz" \
|
|
| patch -p1 -f -s; ) \
|
|
|| return $?
|
|
else
|
|
extract_kernel_archive "$1" ||
|
|
{ extract_kernel_archive "$kver" && mv "linux-$kver" "linux-$1"; } ||
|
|
return $?
|
|
fi
|
|
mv "linux-$1" .. || return $?
|
|
cd "../linux-$1" || return $?
|
|
) || return $?
|
|
rmdir "${tmpdir}"
|
|
}
|
|
|
|
# Patch a kernel tree where $1 is the kernel version.
|
|
function patch_kernel {
|
|
case "$1" in
|
|
*^*)
|
|
# RHEL-compatible distro or UEK.
|
|
;;
|
|
*)
|
|
# See also commit f153b82121b0 ("Sanitize gcc version header
|
|
# includes") # v2.6.29. See also commit 71458cfc782e ("kernel: add
|
|
# support for gcc 5") # v3.18. See also commit cb984d101b30
|
|
# ("compiler-gcc: integrate the various compiler-gcc[345].h
|
|
# files") # v4.2.
|
|
if kernel_version_le 2.6.29 "$1" && kernel_version_lt "$1" 4.2; then
|
|
# Tell the kernel that we are using gcc 4.6 since older kernel
|
|
# versions do not support recent gcc versions. See also commit
|
|
# 9c695203a7dd ("compiler-gcc.h: gcc-4.5 needs noclone and
|
|
# noinline on __naked functions") # v2.6.35.
|
|
if kernel_version_le 2.6.34.2 "$1"; then
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
|
|
index 02ae99e8e6d3..47e12c19c965 100644
|
|
--- a/include/linux/compiler-gcc.h
|
|
+++ b/include/linux/compiler-gcc.h
|
|
@@ -103,7 +103,7 @@
|
|
#define __gcc_header(x) #x
|
|
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
|
|
#define gcc_header(x) _gcc_header(x)
|
|
-#include gcc_header(__GNUC__)
|
|
+#include "linux/compiler-gcc4.h"
|
|
|
|
#if !defined(__noclone)
|
|
#define __noclone /* not needed */
|
|
EOF
|
|
else
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
|
|
index a3ed7cb8ca34..c5a6b8b52db4 100644
|
|
--- a/include/linux/compiler-gcc.h
|
|
+++ b/include/linux/compiler-gcc.h
|
|
@@ -83,4 +83,4 @@
|
|
#define __gcc_header(x) #x
|
|
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
|
|
#define gcc_header(x) _gcc_header(x)
|
|
-#include gcc_header(__GNUC__)
|
|
+#include "linux/compiler-gcc4.h"
|
|
EOF
|
|
fi
|
|
# See also commit 733ed6e43756 ("compiler-gcc{3,4}.h: Use
|
|
# GCC_VERSION macro") # v3.9.
|
|
if kernel_version_le 3.9 "$1"; then
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
|
|
index 769e19864632..2ec6c7a11502 100644
|
|
--- a/include/linux/compiler-gcc4.h
|
|
+++ b/include/linux/compiler-gcc4.h
|
|
@@ -2,13 +2,6 @@
|
|
#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
-/* GCC 4.1.[01] miscompiles __weak */
|
|
-#ifdef __KERNEL__
|
|
-# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
|
-# error Your version of gcc miscompiles the __weak directive
|
|
-# endif
|
|
-#endif
|
|
-
|
|
#define __used __attribute__((__used__))
|
|
#define __must_check __attribute__((warn_unused_result))
|
|
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
|
EOF
|
|
else
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
|
|
index 412bc6c2b023..901ca31be7f8 100644
|
|
--- a/include/linux/compiler-gcc4.h
|
|
+++ b/include/linux/compiler-gcc4.h
|
|
@@ -2,13 +2,6 @@
|
|
#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
-/* GCC 4.1.[01] miscompiles __weak */
|
|
-#ifdef __KERNEL__
|
|
-# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1
|
|
-# error Your version of gcc miscompiles the __weak directive
|
|
-# endif
|
|
-#endif
|
|
-
|
|
#define __used __attribute__((__used__))
|
|
#define __must_check __attribute__((warn_unused_result))
|
|
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
|
EOF
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [ "${1#2.6.31}" != "$1" ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
Checking a 2.6.31.1 kernel configured with allyesconfig/allmodconfig
|
|
with sparse (make C=2) triggers a sparse warning on code that uses the
|
|
kmemcheck_annotate_bitfield() macro. An example of such a warning:
|
|
|
|
include/net/inet_sock.h:208:17: warning: do-while statement is not a compound statement
|
|
|
|
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
|
|
Cc: Vegard Nossum <vegardno@ifi.uio.no>
|
|
Cc: Andrew Morton <akpm@linux-foundation.org>
|
|
|
|
---
|
|
See also http://lkml.org/lkml/2009/9/26/51
|
|
|
|
--- linux-2.6.31.1/include/linux/kmemcheck-orig.h 2009-09-26 13:53:44.000000000 +0200
|
|
+++ linux-2.6.31.1/include/linux/kmemcheck.h 2009-09-26 13:53:56.000000000 +0200
|
|
@@ -137,13 +137,13 @@ static inline void kmemcheck_mark_initia
|
|
int name##_end[0];
|
|
|
|
#define kmemcheck_annotate_bitfield(ptr, name) \
|
|
- do if (ptr) { \
|
|
+ do { if (ptr) { \
|
|
int _n = (long) &((ptr)->name##_end) \
|
|
- (long) &((ptr)->name##_begin); \
|
|
BUILD_BUG_ON(_n < 0); \
|
|
\
|
|
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
|
|
- } while (0)
|
|
+ } } while (0)
|
|
|
|
#define kmemcheck_annotate_variable(var) \
|
|
do { \
|
|
EOF
|
|
fi
|
|
if [ "${1#2.6.32}" != "$1" ] || [ "${1#2.6.33}" != "$1" ]
|
|
then
|
|
patch -f -s -p1 <<'EOF'
|
|
Get rid of sparse errors on sk_buff.protocol.
|
|
|
|
--- linux/include/linux/skbuff-orig.h 2010-12-07 13:40:51.000000000 -0500
|
|
+++ linux/include/linux/skbuff.h 2010-12-07 13:41:05.000000000 -0500
|
|
@@ -349,8 +349,8 @@ struct sk_buff {
|
|
ipvs_property:1,
|
|
peeked:1,
|
|
nf_trace:1;
|
|
- __be16 protocol:16;
|
|
kmemcheck_bitfield_end(flags1);
|
|
+ __be16 protocol;
|
|
|
|
void (*destructor)(struct sk_buff *skb);
|
|
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
|
EOF
|
|
fi
|
|
|
|
if [ "${1#3.13}" != "$1" ]; then
|
|
if [ "$1" = "3.13" ] || [ "${1#3.13.}" -lt 6 ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From 7b4ec8dd7d4ac467e9eee4d49f2c9574d773efbb Mon Sep 17 00:00:00 2001
|
|
From: Johannes Berg <johannes.berg@intel.com>
|
|
Date: Thu, 16 Jan 2014 10:18:48 +1030
|
|
Subject: [PATCH] export: declare ksymtab symbols
|
|
|
|
sparse complains about any __ksymtab symbols with the following:
|
|
|
|
warning: symbol '__ksymtab_...' was not declared. Should it be static?
|
|
|
|
due to Andi's patch making it non-static.
|
|
|
|
Mollify sparse by declaring the symbol extern, otherwise we get
|
|
drowned in sparse warnings for anything that uses EXPORT_SYMBOL
|
|
in the sources, making it easy to miss real warnings.
|
|
|
|
Fixes: e0f244c63fc9 ("asmlinkage, module: Make ksymtab [...] __visible")
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Acked-by: Andi Kleen <ak@linux.intel.com>
|
|
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
|
|
---
|
|
include/linux/export.h | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/include/linux/export.h b/include/linux/export.h
|
|
index 3f2793d..96e45ea 100644
|
|
--- a/include/linux/export.h
|
|
+++ b/include/linux/export.h
|
|
@@ -59,6 +59,7 @@ extern struct module __this_module;
|
|
static const char __kstrtab_##sym[] \
|
|
__attribute__((section("__ksymtab_strings"), aligned(1))) \
|
|
= VMLINUX_SYMBOL_STR(sym); \
|
|
+ extern const struct kernel_symbol __ksymtab_##sym; \
|
|
__visible const struct kernel_symbol __ksymtab_##sym \
|
|
__used \
|
|
__attribute__((section("___ksymtab" sec "+" #sym), unused)) \
|
|
EOF
|
|
fi
|
|
fi
|
|
|
|
if [ "${1#4.15}" != "$1" ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From ad343a98e74e85aa91d844310e797f96fee6983b Mon Sep 17 00:00:00 2001
|
|
From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
|
|
Date: Tue, 6 Feb 2018 15:37:52 -0800
|
|
Subject: [PATCH] tools/lib/subcmd/pager.c: do not alias select() params
|
|
|
|
Use a separate fd set for select()-s exception fds param to fix the
|
|
following gcc warning:
|
|
|
|
pager.c:36:12: error: passing argument 2 to restrict-qualified parameter aliases with argument 4 [-Werror=restrict]
|
|
select(1, &in, NULL, &in, NULL);
|
|
^~~ ~~~
|
|
|
|
Link: http://lkml.kernel.org/r/20180101105626.7168-1-sergey.senozhatsky@gmail.com
|
|
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
|
|
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
---
|
|
tools/lib/subcmd/pager.c | 5 ++++-
|
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/tools/lib/subcmd/pager.c b/tools/lib/subcmd/pager.c
|
|
index 5ba754d17952..9997a8805a82 100644
|
|
--- a/tools/lib/subcmd/pager.c
|
|
+++ b/tools/lib/subcmd/pager.c
|
|
@@ -30,10 +30,13 @@ static void pager_preexec(void)
|
|
* have real input
|
|
*/
|
|
fd_set in;
|
|
+ fd_set exception;
|
|
|
|
FD_ZERO(&in);
|
|
+ FD_ZERO(&exception);
|
|
FD_SET(0, &in);
|
|
- select(1, &in, NULL, &in, NULL);
|
|
+ FD_SET(0, &exception);
|
|
+ select(1, &in, NULL, &exception, NULL);
|
|
|
|
setenv("LESS", "FRSX", 0);
|
|
}
|
|
EOF
|
|
patch -f -s -p1 <<'EOF'
|
|
From 854e55ad289ef8888e7991f0ada85d5846f5afb9 Mon Sep 17 00:00:00 2001
|
|
From: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Date: Thu, 15 Mar 2018 22:11:54 -0500
|
|
Subject: [PATCH] objtool, perf: Fix GCC 8 -Wrestrict error
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Starting with recent GCC 8 builds, objtool and perf fail to build with
|
|
the following error:
|
|
|
|
../str_error_r.c: In function 'str_error_r':
|
|
../str_error_r.c:25:3: error: passing argument 1 to restrict-qualified parameter aliases with argument 5 [-Werror=restrict]
|
|
snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
|
|
|
|
The code seems harmless, but there's probably no benefit in printing the
|
|
'buf' pointer in this situation anyway, so just remove it to make GCC
|
|
happy.
|
|
|
|
Reported-by: Laura Abbott <labbott@redhat.com>
|
|
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Tested-by: Laura Abbott <labbott@redhat.com>
|
|
Cc: Adrian Hunter <adrian.hunter@intel.com>
|
|
Cc: Jiri Olsa <jolsa@kernel.org>
|
|
Cc: Namhyung Kim <namhyung@kernel.org>
|
|
Cc: Wang Nan <wangnan0@huawei.com>
|
|
Link: http://lkml.kernel.org/r/20180316031154.juk2uncs7baffctp@treble
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
---
|
|
tools/lib/str_error_r.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/tools/lib/str_error_r.c b/tools/lib/str_error_r.c
|
|
index d6d65537b0d9..6aad8308a0ac 100644
|
|
--- a/tools/lib/str_error_r.c
|
|
+++ b/tools/lib/str_error_r.c
|
|
@@ -22,6 +22,6 @@ char *str_error_r(int errnum, char *buf, size_t buflen)
|
|
{
|
|
int err = strerror_r(errnum, buf, buflen);
|
|
if (err)
|
|
- snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
|
|
+ snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, [buf], %zd)=%d", errnum, buflen, err);
|
|
return buf;
|
|
}
|
|
EOF
|
|
fi
|
|
|
|
if kernel_version_le 2.6.36 "$1" && kernel_version_lt "$1" 4.8; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From c6a385539175ebc603da53aafb7753d39089f32e Mon Sep 17 00:00:00 2001
|
|
From: Borislav Petkov <bp@suse.de>
|
|
Date: Mon, 14 Nov 2016 19:41:31 +0100
|
|
Subject: [PATCH] kbuild: Steal gcc's pie from the very beginning
|
|
|
|
So Sebastian turned off the PIE for kernel builds but that was too late
|
|
- Kbuild.include already uses KBUILD_CFLAGS and trying to disable gcc
|
|
options with, say cc-disable-warning, fails:
|
|
|
|
gcc -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
|
|
...
|
|
-Wno-sign-compare -fno-asynchronous-unwind-tables -Wframe-address -c -x c /dev/null -o .31392.tmp
|
|
/dev/null:1:0: error: code model kernel does not support PIC mode
|
|
|
|
because that returns an error and we can't disable the warning. For
|
|
example in this case:
|
|
|
|
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
|
|
|
which leads to gcc issuing all those warnings again.
|
|
|
|
So let's turn off PIE/PIC at the earliest possible moment, when we
|
|
declare KBUILD_CFLAGS so that cc-disable-warning picks it up too.
|
|
|
|
Also, we need the $(call cc-option ...) because -fno-PIE is supported
|
|
since gcc v3.4 and our lowest supported gcc version is 3.2 right now.
|
|
|
|
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Cc: stable@vger.kernel.org
|
|
Cc: Ben Hutchings <ben@decadent.org.uk>
|
|
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Signed-off-by: Michal Marek <mmarek@suse.com>
|
|
[ bvanassche: moved -fno-PIE to start of KBUILD_CFLAGS ]
|
|
---
|
|
Makefile | 7 +++----
|
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
index 0ed6ce300543..c324b43712f0 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -378,7 +378,8 @@ LINUXINCLUDE := \
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
@@ -387,7 +388,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
|
|
KBUILD_AFLAGS_KERNEL :=
|
|
KBUILD_CFLAGS_KERNEL :=
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
KBUILD_AFLAGS_MODULE := -DMODULE
|
|
KBUILD_CFLAGS_MODULE := -DMODULE
|
|
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
|
|
EOF
|
|
else
|
|
case "$1" in
|
|
# CentOS 6.x.
|
|
2.6.32-*)
|
|
patch -f -s -p1 <<'EOF'
|
|
--- linux-2.6.32-754.29.1.el6/Makefile.orig 2020-05-13 14:09:18.448503420 -0700
|
|
+++ linux-2.6.32-754.29.1.el6/Makefile 2020-05-13 14:11:24.265441790 -0700
|
|
@@ -355,7 +355,8 @@
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
@@ -380,7 +381,7 @@
|
|
endif ##($(KBUILD_EXTMOD),)
|
|
endif #(,$(filter $(ARCH), i386 x86_64))
|
|
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
|
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
|
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
|
EOF
|
|
;;
|
|
2.6.3[1-5]*)
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/Makefile b/Makefile
|
|
index 141da26fda4b..343ec388ae2e 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -349,12 +349,13 @@ LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
-fno-delete-null-pointer-checks
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
|
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
|
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
|
EOF
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
case "$1" in
|
|
4.18.0-*) # CentOS 8.x
|
|
patch -f -s -p1 <<'EOF'
|
|
From a6e60d84989fa0e91db7f236eda40453b0e44afa Mon Sep 17 00:00:00 2001
|
|
From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
|
Date: Sat, 19 Jan 2019 20:59:34 +0100
|
|
Subject: [PATCH] include/linux/module.h: copy __init/__exit attrs to
|
|
init/cleanup_module
|
|
|
|
The upcoming GCC 9 release extends the -Wmissing-attributes warnings
|
|
(enabled by -Wall) to C and aliases: it warns when particular function
|
|
attributes are missing in the aliases but not in their target.
|
|
|
|
In particular, it triggers for all the init/cleanup_module
|
|
aliases in the kernel (defined by the module_init/exit macros),
|
|
ending up being very noisy.
|
|
|
|
These aliases point to the __init/__exit functions of a module,
|
|
which are defined as __cold (among other attributes). However,
|
|
the aliases themselves do not have the __cold attribute.
|
|
|
|
Since the compiler behaves differently when compiling a __cold
|
|
function as well as when compiling paths leading to calls
|
|
to __cold functions, the warning is trying to point out
|
|
the possibly-forgotten attribute in the alias.
|
|
|
|
In order to keep the warning enabled, we decided to silence
|
|
this case. Ideally, we would mark the aliases directly
|
|
as __init/__exit. However, there are currently around 132 modules
|
|
in the kernel which are missing __init/__exit in their init/cleanup
|
|
functions (either because they are missing, or for other reasons,
|
|
e.g. the functions being called from somewhere else); and
|
|
a section mismatch is a hard error.
|
|
|
|
A conservative alternative was to mark the aliases as __cold only.
|
|
However, since we would like to eventually enforce __init/__exit
|
|
to be always marked, we chose to use the new __copy function
|
|
attribute (introduced by GCC 9 as well to deal with this).
|
|
With it, we copy the attributes used by the target functions
|
|
into the aliases. This way, functions that were not marked
|
|
as __init/__exit won't have their aliases marked either,
|
|
and therefore there won't be a section mismatch.
|
|
|
|
Note that the warning would go away marking either the extern
|
|
declaration, the definition, or both. However, we only mark
|
|
the definition of the alias, since we do not want callers
|
|
(which only see the declaration) to be compiled as if the function
|
|
was __cold (and therefore the paths leading to those calls
|
|
would be assumed to be unlikely).
|
|
|
|
Link: https://lore.kernel.org/lkml/20190123173707.GA16603@gmail.com/
|
|
Link: https://lore.kernel.org/lkml/20190206175627.GA20399@gmail.com/
|
|
Suggested-by: Martin Sebor <msebor@gcc.gnu.org>
|
|
Acked-by: Jessica Yu <jeyu@kernel.org>
|
|
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
|
---
|
|
include/linux/module.h | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/include/linux/module.h b/include/linux/module.h
|
|
index 8fa38d3e7538..f5bc4c046461 100644
|
|
--- a/include/linux/module.h
|
|
+++ b/include/linux/module.h
|
|
@@ -129,13 +129,13 @@ extern void cleanup_module(void);
|
|
#define module_init(initfn) \
|
|
static inline initcall_t __maybe_unused __inittest(void) \
|
|
{ return initfn; } \
|
|
- int init_module(void) __attribute__((alias(#initfn)));
|
|
+ int init_module(void) __attribute__((__copy__(initfn))) __attribute__((alias(#initfn)));
|
|
|
|
/* This is only required if you want to be unloadable. */
|
|
#define module_exit(exitfn) \
|
|
static inline exitcall_t __maybe_unused __exittest(void) \
|
|
{ return exitfn; } \
|
|
- void cleanup_module(void) __attribute__((alias(#exitfn)));
|
|
+ void cleanup_module(void) __attribute__((__copy__(exitfn))) __attribute__((alias(#exitfn)));
|
|
|
|
#endif
|
|
|
|
EOF
|
|
;;
|
|
2.*|3.*)
|
|
patch -f -s -p1 <<'EOF'
|
|
--- linux-3.10.0-1127.el7/include/linux/init.h.orig 2020-05-09 20:55:48.638956513 -0700
|
|
+++ linux-3.10.0-1127.el7/include/linux/init.h 2020-05-09 20:56:46.947612445 -0700
|
|
@@ -309,13 +309,15 @@
|
|
#define module_init(initfn) \
|
|
static inline initcall_t __inittest(void) \
|
|
{ return initfn; } \
|
|
- int init_module(void) __attribute__((alias(#initfn)));
|
|
+ int init_module(void) __attribute__((__copy__(initfn))) \
|
|
+ __attribute__((alias(#initfn)));
|
|
|
|
/* This is only required if you want to be unloadable. */
|
|
#define module_exit(exitfn) \
|
|
static inline exitcall_t __exittest(void) \
|
|
{ return exitfn; } \
|
|
- void cleanup_module(void) __attribute__((alias(#exitfn)));
|
|
+ void cleanup_module(void) __attribute__((__copy__(exitfn)))\
|
|
+ __attribute__((alias(#exitfn)));
|
|
|
|
#define __setup_param(str, unique_id, fn) /* nothing */
|
|
#define __setup(str, func) /* nothing */
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
if kernel_version_le 3.2 "$1" && kernel_version_lt "$1" 3.18; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From eeeda4cd06e828b331b15741a204ff9f5874d28d Mon Sep 17 00:00:00 2001
|
|
From: Ben Hutchings <ben@decadent.org.uk>
|
|
Date: Wed, 24 Sep 2014 13:30:12 +0100
|
|
Subject: [PATCH] x86/relocs: Make per_cpu_load_addr static
|
|
|
|
per_cpu_load_addr is only used for 64-bit relocations, but is
|
|
declared in both configurations of relocs.c - with different
|
|
types. This has undefined behaviour in general. GNU ld is
|
|
documented to use the larger size in this case, but other tools
|
|
may differ and some warn about this.
|
|
|
|
References: https://bugs.debian.org/748577
|
|
Reported-by: Michael Tautschnig <mt@debian.org>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
Cc: 748577@bugs.debian.org
|
|
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Link: http://lkml.kernel.org/r/1411561812.3659.23.camel@decadent.org.uk
|
|
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|
---
|
|
arch/x86/tools/relocs.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
|
|
index bbb1d2259ecf..a5efb21d5228 100644
|
|
--- a/arch/x86/tools/relocs.c
|
|
+++ b/arch/x86/tools/relocs.c
|
|
@@ -695,7 +695,7 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
|
|
*
|
|
*/
|
|
static int per_cpu_shndx = -1;
|
|
-Elf_Addr per_cpu_load_addr;
|
|
+static Elf_Addr per_cpu_load_addr;
|
|
|
|
static void percpu_init(void)
|
|
{
|
|
EOF
|
|
fi
|
|
|
|
# See also commit e33a814e772c ("scripts/dtc: Remove redundant YYLOC global
|
|
# declaration") # v5.6~10^2.
|
|
if kernel_version_le 2.6.38 "$1" && kernel_version_lt "$1" 5.6; then
|
|
patch -p1 -f -s <<'EOF'
|
|
From e33a814e772cdc36436c8c188d8c42d019fda639 Mon Sep 17 00:00:00 2001
|
|
From: Dirk Mueller <dmueller@suse.com>
|
|
Date: Tue, 14 Jan 2020 18:53:41 +0100
|
|
Subject: [PATCH] scripts/dtc: Remove redundant YYLOC global declaration
|
|
|
|
gcc 10 will default to -fno-common, which causes this error at link
|
|
time:
|
|
|
|
(.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here
|
|
|
|
This is because both dtc-lexer as well as dtc-parser define the same
|
|
global symbol yyloc. Before with -fcommon those were merged into one
|
|
defintion. The proper solution would be to mark this as "extern",
|
|
however that leads to:
|
|
|
|
dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls]
|
|
26 | extern YYLTYPE yylloc;
|
|
| ^~~~~~
|
|
In file included from dtc-lexer.l:24:
|
|
dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here
|
|
127 | extern YYLTYPE yylloc;
|
|
| ^~~~~~
|
|
cc1: all warnings being treated as errors
|
|
|
|
which means the declaration is completely redundant and can just be
|
|
dropped.
|
|
|
|
Signed-off-by: Dirk Mueller <dmueller@suse.com>
|
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
[robh: cherry-pick from upstream]
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Rob Herring <robh@kernel.org>
|
|
---
|
|
scripts/dtc/dtc-lexer.l | 1 -
|
|
1 file changed, 1 deletion(-)
|
|
|
|
diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l
|
|
index 5c6c3fd557d7..b3b7270300de 100644
|
|
--- a/scripts/dtc/dtc-lexer.l
|
|
+++ b/scripts/dtc/dtc-lexer.l
|
|
@@ -23,7 +23,6 @@ LINECOMMENT "//".*\n
|
|
#include "srcpos.h"
|
|
#include "dtc-parser.tab.h"
|
|
|
|
-YYLTYPE yylloc;
|
|
extern bool treesource_error;
|
|
|
|
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
|
diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
index 5c6c3fd557d7..b3b7270300de 100644
|
|
--- a/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
+++ b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
@@ -23,7 +23,6 @@ LINECOMMENT "//".*\n
|
|
#include "srcpos.h"
|
|
#include "dtc-parser.tab.h"
|
|
|
|
-YYLTYPE yylloc;
|
|
extern bool treesource_error;
|
|
|
|
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
|
EOF
|
|
fi
|
|
|
|
# See also commit 52a9dab6d892 ("libsubcmd: Fix use-after-free for
|
|
# realloc(..., 0)") # v5.17
|
|
if kernel_version_le 2.6.38 "$1" && kernel_version_lt "$1" 5.17; then
|
|
patch -p1 -f -s <<'EOF'
|
|
From 52a9dab6d892763b2a8334a568bd4e2c1a6fde66 Mon Sep 17 00:00:00 2001
|
|
From: Kees Cook <keescook@chromium.org>
|
|
Date: Sun, 13 Feb 2022 10:24:43 -0800
|
|
Subject: [PATCH] libsubcmd: Fix use-after-free for realloc(..., 0)
|
|
|
|
GCC 12 correctly reports a potential use-after-free condition in the
|
|
xrealloc helper. Fix the warning by avoiding an implicit "free(ptr)"
|
|
when size == 0:
|
|
|
|
In file included from help.c:12:
|
|
In function 'xrealloc',
|
|
inlined from 'add_cmdname' at help.c:24:2: subcmd-util.h:56:23: error: pointer may be used after 'realloc' [-Werror=use-after-free]
|
|
56 | ret = realloc(ptr, size);
|
|
| ^~~~~~~~~~~~~~~~~~
|
|
subcmd-util.h:52:21: note: call to 'realloc' here
|
|
52 | void *ret = realloc(ptr, size);
|
|
| ^~~~~~~~~~~~~~~~~~
|
|
subcmd-util.h:58:31: error: pointer may be used after 'realloc' [-Werror=use-after-free]
|
|
58 | ret = realloc(ptr, 1);
|
|
| ^~~~~~~~~~~~~~~
|
|
subcmd-util.h:52:21: note: call to 'realloc' here
|
|
52 | void *ret = realloc(ptr, size);
|
|
| ^~~~~~~~~~~~~~~~~~
|
|
|
|
Fixes: 2f4ce5ec1d447beb ("perf tools: Finalize subcmd independence")
|
|
Reported-by: Valdis Klētnieks <valdis.kletnieks@vt.edu>
|
|
Signed-off-by: Kees Kook <keescook@chromium.org>
|
|
Tested-by: Valdis Klētnieks <valdis.kletnieks@vt.edu>
|
|
Tested-by: Justin M. Forbes <jforbes@fedoraproject.org>
|
|
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Cc: linux-hardening@vger.kernel.org
|
|
Cc: Valdis Klētnieks <valdis.kletnieks@vt.edu>
|
|
Link: http://lore.kernel.org/lkml/20220213182443.4037039-1-keescook@chromium.org
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
---
|
|
tools/lib/subcmd/subcmd-util.h | 11 ++---------
|
|
1 file changed, 2 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h
|
|
index 794a375dad36..b2aec04fce8f 100644
|
|
--- a/tools/lib/subcmd/subcmd-util.h
|
|
+++ b/tools/lib/subcmd/subcmd-util.h
|
|
@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...)
|
|
static inline void *xrealloc(void *ptr, size_t size)
|
|
{
|
|
void *ret = realloc(ptr, size);
|
|
- if (!ret && !size)
|
|
- ret = realloc(ptr, 1);
|
|
- if (!ret) {
|
|
- ret = realloc(ptr, size);
|
|
- if (!ret && !size)
|
|
- ret = realloc(ptr, 1);
|
|
- if (!ret)
|
|
- die("Out of memory, realloc failed");
|
|
- }
|
|
+ if (!ret)
|
|
+ die("Out of memory, realloc failed");
|
|
return ret;
|
|
}
|
|
EOF
|
|
fi
|
|
|
|
# Use sed to patch the ____ilog2_NaN() prototype.
|
|
sed -i 's/__attribute__((const, noreturn))/__attribute__((noreturn))/' \
|
|
include/linux/log2.h tools/include/linux/log2.h 2>/dev/null
|
|
|
|
# After patch-v4.14.1[12] has been applied, the execute bit has to be
|
|
# set for sync-check.sh since patch can't do that.
|
|
for f in "tools/objtool/sync-check.sh"; do
|
|
if [ -e "$f" ]; then
|
|
chmod a+x "$f"
|
|
fi
|
|
done
|
|
}
|
|
|
|
function rpm_payload_is_readable {
|
|
rpm2cpio "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
function download_valid_rpm {
|
|
local rpmfile="$1"
|
|
local tmpfile="${rpmfile}.tmp.$$"
|
|
local url
|
|
|
|
shift
|
|
|
|
if [ "$(type -p rpm2cpio)" = "" ]; then
|
|
echo "Error: rpm2cpio has not been installed." >&2
|
|
return 1
|
|
fi
|
|
|
|
if [ -e "$rpmfile" ]; then
|
|
if rpm_payload_is_readable "$rpmfile"; then
|
|
return 0
|
|
fi
|
|
echo "Removing invalid cached RPM ${kernel_downloads}/${rpmfile}." >&2
|
|
rm -f "$rpmfile"
|
|
fi
|
|
|
|
for url; do
|
|
rm -f "$tmpfile"
|
|
if wget -q -O "$tmpfile" "${url%/}/${rpmfile}"; then
|
|
if rpm_payload_is_readable "$tmpfile"; then
|
|
mv "$tmpfile" "$rpmfile"
|
|
return 0
|
|
fi
|
|
echo "Downloaded RPM ${url%/}/${rpmfile} has an invalid payload." >&2
|
|
fi
|
|
done
|
|
rm -f "$tmpfile"
|
|
return 1
|
|
}
|
|
|
|
function extract_rhel_kernel_archive {
|
|
local archive kver="$1" stripped_kver topdir
|
|
|
|
stripped_kver="${kver%.0.[0-9]*}"
|
|
for archive in "linux-${kver}"*.tar.* \
|
|
"linux-${stripped_kver}"*.tar.* linux-*.tar.*; do
|
|
[ -e "$archive" ] || continue
|
|
topdir="$(tar tf "$archive" | sed -n '1{s,/.*,,;p;}')" ||
|
|
return $?
|
|
if [ -z "$topdir" ]; then
|
|
echo "Error: empty Linux source archive $archive." >&2
|
|
return 1
|
|
fi
|
|
tar xaf "$archive" &&
|
|
mv "$topdir" "../linux-${kver}"
|
|
return $?
|
|
done
|
|
|
|
echo "Error: no Linux source archive found for kernel $kver." >&2
|
|
return 1
|
|
}
|
|
|
|
function download_and_extract_distro_rpm {
|
|
[ -n "$1" ] || return $?
|
|
set -- ${1//^/ }
|
|
local kver=$1
|
|
local distro=$2
|
|
local release=$3
|
|
local rpmfile
|
|
|
|
mkdir -p "${kernel_downloads}" || return $?
|
|
|
|
(
|
|
cd "${kernel_downloads}" || exit $?
|
|
read -a urls -r <<<"$(get_srpm_urls "$distro" "$release" x86_64 |
|
|
tr '\n' ' ')"
|
|
case "$distro" in
|
|
CentOS|AlmaLinux|RockyLinux|Rocky)
|
|
rpmfile="kernel-${kver}.src.rpm"
|
|
;;
|
|
UEK)
|
|
rpmfile="kernel-uek-${kver}.src.rpm"
|
|
;;
|
|
*)
|
|
echo "Error: unknown distro $distro" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
download_valid_rpm "$rpmfile" "${urls[@]}"
|
|
) || return $?
|
|
local tmpdir=kernel-tree-tmp-$$
|
|
rm -rf "linux-$1" "${tmpdir}"
|
|
mkdir "${tmpdir}" || return $?
|
|
(
|
|
set -o pipefail
|
|
cd "${tmpdir}" &&
|
|
case "$distro" in
|
|
CentOS|AlmaLinux|RockyLinux|Rocky)
|
|
rpm2cpio "${kernel_downloads}/kernel-${kver}.src.rpm" |
|
|
cpio -i --make-directories --quiet &&
|
|
extract_rhel_kernel_archive "$kver"
|
|
;;
|
|
UEK)
|
|
rpm2cpio "${kernel_downloads}/kernel-uek-${kver}.src.rpm" |
|
|
cpio -i --make-directories --quiet &&
|
|
tar xaf "linux-${kver/-*}.tar."* &&
|
|
mv "linux-${kver/-*}" "../linux-${kver}"
|
|
;;
|
|
*)
|
|
echo "Error: unknown distro $distro"
|
|
;;
|
|
esac
|
|
) || return $?
|
|
rm -rf "${tmpdir}"
|
|
}
|
|
|
|
function download_and_extract_kernel_tree {
|
|
if [ "${1/^}" = "$1" ]; then
|
|
# Upstream kernel.
|
|
if [ -e "${kernel_tree}" ]; then
|
|
# If a git kernel tree is available, obtain the kernel source code
|
|
# from that git tree.
|
|
(
|
|
cd "${kernel_tree}" &&
|
|
{
|
|
{ git tag -l "v$1" | grep -q '^v'; } ||
|
|
{
|
|
echo "Could not find tag v$1;" \
|
|
"updating git repository" 1>&2
|
|
git fetch origin
|
|
git fetch stable
|
|
}
|
|
} &&
|
|
{ git tag -l "v$1" | grep -q '^v'; } &&
|
|
git archive "v$1"
|
|
) | {
|
|
rm -rf "linux-$1" &&
|
|
mkdir "linux-$1" &&
|
|
tar -C "linux-$1" -xf- 2>/dev/null
|
|
}
|
|
else
|
|
# Otherwise download a source code tar file and extract it.
|
|
download_kernel "$1" && extract_kernel_tree "$1"
|
|
fi
|
|
else
|
|
# Distro kernel.
|
|
download_and_extract_distro_rpm "$1"
|
|
fi &&
|
|
(cd "linux-${1/^*}" && patch_kernel "${1/^*}")
|
|
}
|
|
|
|
# For shellcheck
|
|
if false; then
|
|
quiet_download=true
|
|
fi
|