Skip to contentSkip to conversation

Fix NULL-pointer dereference in ia64_machine_kexec()

PATCH In review Bernhard Walle 2 participants 6 messages Jan 25, 2007 – Feb 6, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fix NULL-pointer dereference in ia64_machine_kexec()

This patch fixes a NULL-pointer dereference in ia64_machine_kexec().

The variable ia64_kimage is set in machine_kexec_prepare() which is called from sys_kexec_load(). If kdump wasn't configured before, ia64_kimage is NULL. machine_kdump_on_init() passes ia64_kimage() to machine_kexec() which assumes a valid value.

The patch also adds a few sanity checks for the image to simplify debugging of similar problems in future.

---
 arch/ia64/kernel/crash.c         |    4 ++++
 arch/ia64/kernel/machine_kexec.c |    2 ++
 2 files changed, 6 insertions(+)

Index: current-kernel/arch/ia64/kernel/crash.c =================================--- current-kernel.orig/arch/ia64/kernel/crash.c +++ current-kernel/arch/ia64/kernel/crash.c
@@ -116,6 +116,10 @@ machine_crash_shutdown(struct pt_regs *p
static void
machine_kdump_on_init(void)
{
+ if (!ia64_kimage) {
+ printk(KERN_NOTICE "Kdump not configured\n");
+ return;
+ }

        local_irq_disable();
        kexec_disable_iosapic();
        machine_kexec(ia64_kimage);

Index: current-kernel/arch/ia64/kernel/machine_kexec.c =================================--- current-kernel.orig/arch/ia64/kernel/machine_kexec.c +++ current-kernel/arch/ia64/kernel/machine_kexec.c
@@ -93,6 +93,7 @@ static void ia64_machine_kexec(struct un

        unsigned long vector;
        int ii;
+       BUG_ON(!image);
        if (image->type = KEXEC_TYPE_CRASH) {
                crash_save_this_cpu();
                current->thread.ksp = (__u64)info->sw - 16;

@@ -131,6 +132,7 @@ static void ia64_machine_kexec(struct un

void machine_kexec(struct kimage *image)
{

+       BUG_ON(!image);
        unw_init_running(ia64_machine_kexec, image);
        for(;;);

}

#1 lore raw
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Bernhard" = Bernhard Walle <[email protected]> writes:

Bernhard> printk(KERN_NOTICE "Kdump not configured\n");

Hi Bernhard,

Wouldn't it make more sense to make that messages a bit more descriptive? Ie. include something about what it tried to do when it noticed it wasn't configured?

Cheers,
Jes

#2 lore raw
In reply to Bernhard Walle

Hello Jes,

Quoted 7 lines · Jes Sorensen
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Bernhard" = Bernhard Walle <[email protected]> writes:

Bernhard> printk(KERN_NOTICE "Kdump not configured\n");

Wouldn't it make more sense to make that messages a bit more descriptive? Ie. include something about what it tried to do when it noticed it wasn't configured?

Do you think

machine_kdump_on_init(): kdump not configured

would be better? That would make it easier to find the position of the message in code. Or did you think of a more verbal description like

tried to dump but that's not possible because kdump was not configured (ia64_kimage = NULL)

But I think we shouldn't write novels in the kernel log. ;)

But feel free to suggest another proposal and I'll update the patch. I just want to see it included in mainline.

Regards,
Bernhard

#3 lore raw
In reply to Bernhard Walle
Quoted 10 lines · Bernhard Walle

Hello Jes,

Quoted 6 lines · Jes Sorensen
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Bernhard" = Bernhard Walle <[email protected]> writes:

Bernhard> printk(KERN_NOTICE "Kdump not configured\n");

Wouldn't it make more sense to make that messages a bit more descriptive? Ie. include something about what it tried to do when it noticed it wasn't configured?

Quoted 6 lines

Do you think

machine_kdump_on_init(): kdump not configured

would be better? That would make it easier to find the position of the message in code. Or did you think of a more verbal description like

That would do just fine I think, anything to avoid having to run find and grep on the tree to figure out where it came from :)

Cheers,
Jes

#4 lore raw

PATCH 1/1 Fix NULL-pointer dereference in ia64_machine_kexec()

[I got no response after my corrected patch, so I try it again. I request it to appear in -mm tree. Patch is against 2.6.20-rc6-mm3.]

This patch fixes a NULL-pointer dereference in ia64_machine_kexec().

The variable ia64_kimage is set in machine_kexec_prepare() which is called from sys_kexec_load(). If kdump wasn't configured before, ia64_kimage is NULL. machine_kdump_on_init() passes ia64_kimage() to machine_kexec() which assumes a valid value.

The patch also adds a few sanity checks for the image to simplify debugging of similar problems in future.

---
 arch/ia64/kernel/crash.c         |    5 +++++
 arch/ia64/kernel/machine_kexec.c |    2 ++
 2 files changed, 7 insertions(+)

Index: b/arch/ia64/kernel/crash.c =================================--- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c
@@ -116,6 +116,11 @@ machine_crash_shutdown(struct pt_regs *p
static void
machine_kdump_on_init(void)
{
+ if (!ia64_kimage) {
+ printk(KERN_NOTICE "machine_kdump_on_init(): "
+ "kdump not configured\n");
+ return;
+ }
local_irq_disable();
kexec_disable_iosapic();
machine_kexec(ia64_kimage);
Index: b/arch/ia64/kernel/machine_kexec.c =================================--- a/arch/ia64/kernel/machine_kexec.c +++ b/arch/ia64/kernel/machine_kexec.c
@@ -93,6 +93,7 @@ static void ia64_machine_kexec(struct un
unsigned long vector;
int ii;

+ BUG_ON(!image);
if (image->type = KEXEC_TYPE_CRASH) {
crash_save_this_cpu(); current->thread.ksp = (__u64)info->sw - 16;
@@ -131,6 +132,7 @@ static void ia64_machine_kexec(struct un

void machine_kexec(struct kimage *image)
{
+ BUG_ON(!image);
unw_init_running(ia64_machine_kexec, image); for(;;);
}

#5 lore raw

PATCH 1/1 Fix NULL-pointer dereference in ia64_machine_kexec()

In reply to Bernhard Walle

[After changing the message, 2nd try:]

This patch fixes a NULL-pointer dereference in ia64_machine_kexec().

The variable ia64_kimage is set in machine_kexec_prepare() which is called from sys_kexec_load(). If kdump wasn't configured before, ia64_kimage is NULL. machine_kdump_on_init() passes ia64_kimage() to machine_kexec() which assumes a valid value.

The patch also adds a few sanity checks for the image to simplify debugging of similar problems in future.

---
 arch/ia64/kernel/crash.c         |    5 +++++
 arch/ia64/kernel/machine_kexec.c |    2 ++
 2 files changed, 7 insertions(+)

Index: b/arch/ia64/kernel/crash.c =================================--- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c
@@ -116,6 +116,11 @@ machine_crash_shutdown(struct pt_regs *p
static void
machine_kdump_on_init(void)
{
+ if (!ia64_kimage) {
+ printk(KERN_NOTICE "machine_kdump_on_init(): "
+ "kdump not configured\n");
+ return;
+ }
local_irq_disable();
kexec_disable_iosapic();
machine_kexec(ia64_kimage);
Index: b/arch/ia64/kernel/machine_kexec.c =================================--- a/arch/ia64/kernel/machine_kexec.c +++ b/arch/ia64/kernel/machine_kexec.c
@@ -93,6 +93,7 @@ static void ia64_machine_kexec(struct un
unsigned long vector;
int ii;

+ BUG_ON(!image);
if (image->type = KEXEC_TYPE_CRASH) {
crash_save_this_cpu(); current->thread.ksp = (__u64)info->sw - 16;
@@ -131,6 +132,7 @@ static void ia64_machine_kexec(struct un

void machine_kexec(struct kimage *image)
{
+ BUG_ON(!image);
unw_init_running(ia64_machine_kexec, image); for(;;);
}