Skip to content

Commit

Permalink
Make SLES9 "get_kernel_version" work on the kernel binary again
Browse files Browse the repository at this point in the history
As reported by Andy Whitcroft, at least the SLES9 initrd build process
depends on getting the kernel version from the kernel binary.  It does
that by simply trawling the binary and looking for the signature of the
"linux_banner" string (the string "Linux version " to be exact. Which
is really broken in itself, but whatever..)

That got broken when the string was changed to allow /proc/version to
change the UTS release information dynamically, and "get_kernel_version"
thus returned "%s" (see commit a2ee864:
"[PATCH] Fix linux banner utsname information").

This just restores "linux_banner" as a static string, which should fix
the version finding.  And /proc/version simply uses a different string.

To avoid wasting even that miniscule amount of memory, the early boot
string should really be marked __initdata, but that just causes the same
bug in SLES9 to re-appear, since it will then find other occurrences of
"Linux version " first.

Cc: Andy Whitcroft <[email protected]>
Acked-by: Herbert Poetzl <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Steve Fox <[email protected]>
Acked-by: Olaf Hering <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Linus Torvalds committed Dec 11, 2006
1 parent 9202f32 commit 8993780
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 10 deletions.
12 changes: 10 additions & 2 deletions fs/proc/proc_misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include <linux/vmalloc.h>
#include <linux/crash_dump.h>
#include <linux/pid_namespace.h>
#include <linux/compile.h>
#include <asm/uaccess.h>
#include <asm/pgtable.h>
#include <asm/io.h>
Expand Down Expand Up @@ -253,8 +254,15 @@ static int version_read_proc(char *page, char **start, off_t off,
{
int len;

len = sprintf(page, linux_banner,
utsname()->release, utsname()->version);
/* FIXED STRING! Don't touch! */
len = snprintf(page, PAGE_SIZE,
"%s version %s"
" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
" (" LINUX_COMPILER ")"
" %s\n",
utsname()->sysname,
utsname()->release,
utsname()->version);
return proc_calc_metrics(page, start, off, count, eof, len);
}

Expand Down
2 changes: 0 additions & 2 deletions include/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
#include <asm/byteorder.h>
#include <asm/bug.h>

extern const char linux_banner[];

#define INT_MAX ((int)(~0U>>1))
#define INT_MIN (-INT_MAX - 1)
#define UINT_MAX (~0U)
Expand Down
8 changes: 7 additions & 1 deletion init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,12 @@ void __init __attribute__((weak)) smp_setup_processor_id(void)
{
}

static const char linux_banner[] =
"Linux version " UTS_RELEASE
" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
" (" LINUX_COMPILER ")"
" " UTS_VERSION "\n";

asmlinkage void __init start_kernel(void)
{
char * command_line;
Expand All @@ -509,7 +515,7 @@ asmlinkage void __init start_kernel(void)
boot_cpu_init();
page_address_init();
printk(KERN_NOTICE);
printk(linux_banner, UTS_RELEASE, UTS_VERSION);
printk(linux_banner);
setup_arch(&command_line);
unwind_setup();
setup_per_cpu_areas();
Expand Down
5 changes: 0 additions & 5 deletions init/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,3 @@ struct uts_namespace init_uts_ns = {
},
};
EXPORT_SYMBOL_GPL(init_uts_ns);

const char linux_banner[] =
"Linux version %s (" LINUX_COMPILE_BY "@"
LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") %s\n";

0 comments on commit 8993780

Please sign in to comment.