WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] linux/pci_back: fix NULL pointer ref.

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] linux/pci_back: fix NULL pointer ref.
From: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Date: Fri, 10 Apr 2009 16:06:33 +0900
Delivery-date: Fri, 10 Apr 2009 00:07:02 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.6i
linux/pci_back: fix NULL pointer ref.

This patch fixes the following panic.
pcistub_device_release() can be called during
initialization. Thus pci_get_drvdata() can return NULL.
Fix it by inserting NULL check.

Unable to handle kernel NULL pointer dereference at 0000000000000000 RIP: 
 [<ffffffff8122ec4d>] pciback_config_free_dyn_fields+0xb/0x67
PGD eeb6b067 PUD eb833067 PMD 0 
Oops: 0000 [1] SMP 
CPU 0 
Modules linked in:
Pid: 3181, comm: bash Not tainted 2.6.18.8 #5
RIP: e030:[<ffffffff8122ec4d>]  [<ffffffff8122ec4d>] 
pciback_config_free_dyn_fields+0xb/0x67
RSP: e02b:ffff8800e91edb98  EFLAGS: 00010202
RAX: 0000000000000000 RBX: ffff8800ecfe3ec0 RCX: ffff8800ea8e0000
RDX: ffffffffff578000 RSI: ffff8800ea8e0000 RDI: ffff8800ea8e0000
RBP: ffffffff8122d403 R08: 0000000000000002 R09: 0000000000000000
R10: 0000000000000000 R11: ffffffff81283086 R12: 0000000000000000
R13: ffffffff813f1050 R14: 0000000000000000 R15: ffff8800027c9870
FS:  00002b093b121af0(0000) GS:ffffffff8144b000(0000) knlGS:0000000000000000
CS:  e033 DS: 0000 ES: 0000
Process bash (pid: 3181, threadinfo ffff8800e91ec000, task ffff8800ebf53810)
Stack:  ffff8800ecfe3ec0 ffffffff8122d403 ffff8800ea8e0000 ffffffff8122d419
 ffff8800ecfe3ec0 ffffffff81162976 ffff8800ecfe3ec0 ffff8800ecfe3ec0
 00000000ffffffea ffffffff8122d6e7 ffffffff813f10a8 ffff8800ea8e0000
Call Trace:
 [<ffffffff8122d403>] pcistub_device_release+0x0/0x50
 [<ffffffff8122d419>] pcistub_device_release+0x16/0x50
 [<ffffffff81162976>] kref_put+0x63/0x6e
 [<ffffffff8122d6e7>] pcistub_seize+0x104/0x10b
 [<ffffffff8116ed07>] pci_device_probe+0x4c/0x73
 [<ffffffff812154cc>] pci_bus_probe_wrapper+0x1f2/0x1fe
 [<ffffffff81026bd3>] __wake_up+0x38/0x4f
 [<ffffffff8129d7f6>] netlink_broadcast+0x31a/0x362
 [<ffffffff8116ec15>] pci_match_device+0x13/0xb9
 [<ffffffff8116ed42>] pci_bus_match+0x14/0x20
 [<ffffffff811c9449>] driver_probe_device+0x52/0xa4
 [<ffffffff811c9542>] __device_attach+0x0/0x5
 [<ffffffff811c8b2f>] bus_for_each_drv+0x43/0x77
 [<ffffffff811c93e2>] device_attach+0x56/0x6b
 [<ffffffff811c880f>] bus_attach_device+0x1a/0x35
 [<ffffffff811c7b13>] device_add+0x24d/0x365
 [<ffffffff8116acbc>] pci_bus_add_device+0xd/0x52
 [<ffffffff8117635c>] pci_rescan_buses+0xde/0x1ec
 [<ffffffff8116bbd2>] pci_scan_single_device+0x21/0x11e
 [<ffffffff81176445>] pci_rescan_buses+0x1c7/0x1ec
 [<ffffffff810615b0>] __alloc_pages+0x79/0x2c4
 [<ffffffff8117647a>] enable_slot+0x10/0x1a
 [<ffffffff81175368>] power_write_file+0xa8/0x114
 [<ffffffff810bbc23>] sysfs_write_file+0xbb/0xe6
 [<ffffffff81080b8f>] vfs_write+0xad/0x153
 [<ffffffff81080cf1>] sys_write+0x45/0x6e
 [<ffffffff8100a634>] system_call+0x68/0x6d
 [<ffffffff8100a5cc>] system_call+0x0/0x6d


Code: 49 8b 1c 24 48 8b 2b eb 49 48 8b 7b 10 48 8b 47 28 48 85 c0 
RIP  [<ffffffff8122ec4d>] pciback_config_free_dyn_fields+0xb/0x67
 RSP <ffff8800e91edb98>
CR2: 0000000000000000
 
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>

diff --git a/drivers/xen/pciback/conf_space.c b/drivers/xen/pciback/conf_space.c
--- a/drivers/xen/pciback/conf_space.c
+++ b/drivers/xen/pciback/conf_space.c
@@ -297,6 +297,8 @@ void pciback_config_free_dyn_fields(stru
 
        dev_dbg(&dev->dev,
                "free-ing dynamically allocated virtual configuration space 
fields\n");
+       if (!dev_data)
+               return;
 
        list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
                field = cfg_entry->field;
@@ -321,6 +323,8 @@ void pciback_config_reset_dev(struct pci
        const struct config_field *field;
 
        dev_dbg(&dev->dev, "resetting virtual configuration space\n");
+       if (!dev_data)
+               return;
 
        list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
                field = cfg_entry->field;
@@ -337,6 +341,8 @@ void pciback_config_free_dev(struct pci_
        const struct config_field *field;
 
        dev_dbg(&dev->dev, "free-ing virtual configuration space fields\n");
+       if (!dev_data)
+               return;
 
        list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
                list_del(&cfg_entry->list);


-- 
yamahata

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] linux/pci_back: fix NULL pointer ref., Isaku Yamahata <=