Re: [PATCH 2/3] kbuild: clamp SUBLEVEL to 255
From: Masahiro Yamada <masahiroy@kernel.org>
Date: 2021-02-09 02:00:17
Also in:
lkml
On Mon, Feb 8, 2021 at 10:48 PM David Laight [off-list ref] wrote:
From: Sasha Levinquoted
Sent: 06 February 2021 03:51 Right now if SUBLEVEL becomes larger than 255 it will overflow into the territory of PATCHLEVEL, causing havoc in userspace that tests for specific kernel version. While userspace code tests for MAJOR and PATCHLEVEL, it doesn't test SUBLEVEL at any point as ABI changes don't happen in the context of stable tree. Thus, to avoid overflows, simply clamp SUBLEVEL to it's maximum value in the context of LINUX_VERSION_CODE. This does not affect "make kernelversion" and such. Signed-off-by: Sasha Levin <sashal@kernel.org> --- Makefile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)diff --git a/Makefile b/Makefile index 49ac1b7fe8e99..157be50c691e5 100644 --- a/Makefile +++ b/Makefile@@ -1258,9 +1258,15 @@ define filechk_utsrelease.h endef define filechk_version.h - echo \#define LINUX_VERSION_CODE $(shell \ - expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \ - echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' + if [ $(SUBLEVEL) -gt 255 ]; then \ + echo \#define LINUX_VERSION_CODE $(shell \ + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 255); \ + else \ + echo \#define LINUX_VERSION_CODE $(shell \ + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ + fi; \ + echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \ + ((c) > 255 ? 255 : (c)))' endefWhy not use KERNEL_VERSION to define LINUX_VERSION_CODE ? Basically just: echo '#define LINUX_VERSION_CODE KERNEL_VERSION($(VERSION), $(PATCHLEVEL)+0, $(SUBLEVEL)+0)'
It was not possible to macrofy LINUX_VERSION_CODE.
(build error when CONFIG_KALLSYMS is disabled)
Presumably, this restriction will go away
with the following commit in linux-next.
commit e06af0b2ba02fc0cc2219a14c4c04ff0296a6f9f
Author: Masahiro Yamada [off-list ref]
Date: Thu Jan 28 18:42:30 2021 +1100
init/version.c: remove Version_<LINUX_VERSION_CODE> symbol
My plan is to refactor LINUX_VERSION_CODE in the next
development cycle.
If PATCHLEVEL and SUBLEVEL are guaranteed to be non-empty the +0
can be removed.
The patch assumes they are non-empty, the original pre-prended 0
to stop syntax error for empty version strings.
Note that the expr version will process 08 and 09.
gcc will treat them as octal, and may error them.
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)-- Best Regards Masahiro Yamada