driver core fixes for 3.0
Subsystems (2)
PATCH 1/1 driver core fixes for 3.0
Here's some driver core, and other driver-core related fixes for your 3.0 git tree.
Just a few minor fixes for things that people have reported, the connector and platform.c ones being the biggest one that has hit people recently.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git/ driver-core-linus
All of these patches have been in the linux-next and mm trees for a while now.
The patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
------------
drivers/base/platform.c | 2 +- drivers/connector/connector.c | 1 + drivers/firmware/google/Kconfig | 1 + drivers/misc/pti.c | 11 +++++++---- drivers/misc/ti-st/st_core.c | 2 +- drivers/misc/ti-st/st_kim.c | 8 ++++++-- include/linux/connector.h | 2 +- 7 files changed, 18 insertions(+), 9 deletions(-)
---------------
Andrew Morton (1):
drivers/base/platform.c: don't mark platform_device_register_resndata() as __init_or_module
J Freyensee (3):
pti: double-free security PTI fix
pti: ENXIO error case memory leak PTI fix.
pti: PTI semantics fix in pti_tty_cleanup.
K. Y. Srinivasan (2):
Connector: Set the CN_NETLINK_USERS correctly
Connector: Correctly set the error code in case of success when dispatching receive callbacks
Randy Dunlap (1):
firmware: fix GOOGLE_SMI kconfig dependency warning
Shahar Lev (1):
drivers:misc: ti-st: fix skipping of change remote baud
Steven Rostedt (1):
st_kim: Handle case of no device found for ID 0
PATCH 1/9 firmware: fix GOOGLE_SMI kconfig dependency warning
From: Randy Dunlap <[email protected]>
Is it meaningful/useful to enable EFI_VARS but not EFI? That's what GOOGLE_SMI does. Make it enable EFI also.
Fixes this kconfig dependency warning:
warning: (GOOGLE_SMI) selects EFI_VARS which has unmet direct dependencies (EFI)
--- drivers/firmware/google/Kconfig | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/firmware/google/Kconfig +1 -0
@@ -13,6 +13,7 @@ menu "Google Firmware Drivers" config GOOGLE_SMI tristate "SMI interface for Google platforms" depends on ACPI && DMI + select EFI select EFI_VARS help Say Y here if you want to enable SMI callbacks for Google
Signature · 1 line
1.7.5.4
PATCH 2/9 st_kim: Handle case of no device found for ID 0
From: Steven Rostedt <[email protected]>
Running ktest.pl, I hit this bug:
[ 19.780654] BUG: unable to handle kernel NULL pointer dereference at 0000000c [ 19.780660] IP: [<c112efcd>] dev_get_drvdata+0xc/0x46 [ 19.780669] *pdpt = 0000000031daf001 *pde = 0000000000000000 [ 19.780673] Oops: 0000 [#1] SMP [ 19.780680] Dumping ftrace buffer:^M [ 19.780685] (ftrace buffer empty) [ 19.780687] Modules linked in: ide_pci_generic firewire_ohci firewire_core evbug crc_itu_t e1000 ide_core i2c_i801 iTCO_wdt [ 19.780697] [ 19.780700] Pid: 346, comm: v4l_id Not tainted 2.6.39-test-02740-gcaebc16-dirty #4 /DG965MQ [ 19.780706] EIP: 0060:[<c112efcd>] EFLAGS: 00010202 CPU: 0 [ 19.780709] EIP is at dev_get_drvdata+0xc/0x46 [ 19.780712] EAX: 00000008 EBX: f1e37da4 ECX: 00000000 EDX: 00000000 [ 19.780715] ESI: f1c3f200 EDI: c33ec95c EBP: f1e37d80 ESP: f1e37d80 [ 19.780718] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 19.780721] Process v4l_id (pid: 346, ti=f1e36000 task=f2bc2a60 task.ti=f1e36000) [ 19.780723] Stack: [ 19.780725] f1e37d8c c117d395 c33ec93c f1e37db4 c117a0f9 00000002 00000000 c1725e54 [ 19.780732] 00000001 00000007 f2918c90 f1c3f200 c33ec95c f1e37dd4 c1789d3d 22222222 [ 19.780740] 22222222 22222222 f2918c90 f1c3f200 f29194f4 f1e37de8 c178d5c4 c1725e54 [ 19.780747] Call Trace: [ 19.780752] [<c117d395>] st_kim_ref+0x28/0x41 [ 19.780756] [<c117a0f9>] st_register+0x29/0x562 [ 19.780761] [<c1725e54>] ? v4l2_open+0x111/0x1e3 [ 19.780766] [<c1789d3d>] fmc_prepare+0x97/0x424 [ 19.780770] [<c178d5c4>] fm_v4l2_fops_open+0x70/0x106 [ 19.780773] [<c1725e54>] ? v4l2_open+0x111/0x1e3 [ 19.780777] [<c1725e9b>] v4l2_open+0x158/0x1e3 [ 19.780782] [<c065173b>] chrdev_open+0x22c/0x276 [ 19.780787] [<c0647c4e>] __dentry_open+0x35c/0x581 [ 19.780792] [<c06498f9>] nameidata_to_filp+0x7c/0x96 [ 19.780795] [<c065150f>] ? cdev_put+0x57/0x57 [ 19.780800] [<c0660cad>] do_last+0x743/0x9d4 [ 19.780804] [<c065d5fc>] ? path_init+0x1ee/0x596 [ 19.780808] [<c0661481>] path_openat+0x10c/0x597 [ 19.780813] [<c05204a1>] ? trace_hardirqs_off+0x27/0x37 [ 19.780817] [<c0509651>] ? local_clock+0x78/0xc7 [ 19.780821] [<c0661945>] do_filp_open+0x39/0xc2 [ 19.780827] [<c1cabc76>] ? _raw_spin_unlock+0x4c/0x5d^M [ 19.780831] [<c0674ccd>] ? alloc_fd+0x19e/0x1b7 [ 19.780836] [<c06499ca>] do_sys_open+0xb7/0x1bd [ 19.780840] [<c0608eea>] ? sys_munmap+0x78/0x8d [ 19.780844] [<c0649b06>] sys_open+0x36/0x58 [ 19.780849] [<c1cb809f>] sysenter_do_call+0x12/0x38 [ 19.780852] Code: d8 2f 20 c3 01 83 15 dc 2f 20 c3 00 f0 ff 00 83 05 e0 2f 20 c3 01 83 15 e4 2f 20 c3 00 5d c3 55 89 e5 3e 8d 74 26 00 85 c0 74 28 <8b> 40 04 83 05 e8 2f 20 c3 01 83 15 ec 2f 20 c3 00 85 c0 74 13 ^M [ 19.780889] EIP: [<c112efcd>] dev_get_drvdata+0xc/0x46 SS:ESP 0068:f1e37d80 [ 19.780894] CR2: 000000000000000c [ 19.780898] ---[ end trace e7d1d0f6a2d1d390 ]---
The id of 0 passed to st_kim_ref() found no device, keeping pdev null, and causing pdev->dev cause a NULL pointer dereference. After having st_kim_ref() check for NULL, the st_unregister() function needed to be updated to handle the case that st_gdata was not set by the st_kim_ref().
--- drivers/misc/ti-st/st_core.c | 2 +- drivers/misc/ti-st/st_kim.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletions(-)
drivers/misc/ti-st/st_core.c +1 -1
@@ -605,7 +605,7 @@ long st_unregister(struct st_proto_s *proto)pr_debug ("%s: %d " , __func__, proto->chnl_id);st_kim_ref (&st_gdata,0 ); -if (proto->chnl_id >=ST_MAX_CHANNELS ) { +if (!st_gdata || proto->chnl_id >=ST_MAX_CHANNELS ) {pr_err (" chnl_id %d not supported" , proto->chnl_id);return -EPROTONOSUPPORT ; }
drivers/misc/ti-st/st_kim.c +4 -0
@@ -604,6 +604,10 @@ void st_kim_ref(struct st_data_s **core_data, int id)struct kim_data_s *kim_gdata;/* get kim_gdata reference from platform device */ pdev =st_get_plat_device (id); +if (!pdev) { + *core_data =NULL ; +return ; + } kim_gdata =dev_get_drvdata (&pdev->dev); *core_data = kim_gdata->core_data; }
Signature · 1 line
1.7.5.4
PATCH 3/9 drivers/base/platform.c: don't mark platform_device_register_resndata() as __init_or_module
In reply to Greg Kroah-HartmanFrom: Andrew Morton <[email protected]>
This reverts 737a3bb9416ce2a7c7a4 ("Driver core: move platform device creation helpers to .init.text (if MODULE=n)"). That patch assumed that platform_device_register_resndata() is only ever called from __init code but that isn't true in the case ioctl->drm_ioctl->radeon_cp_init().
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=35192
--- drivers/base/platform.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/platform.c +1 -1
@@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);* * Returns &struct platform_device pointer on success, or ERR_PTR() on error. */ -struct platform_device *__init_or_module platform_device_register_resndata( +struct platform_device *platform_device_register_resndata( struct device *parent, const char *name, int id, const struct resource *res, unsigned int num,
Signature · 1 line
1.7.5.4
PATCH 4/9 drivers:misc: ti-st: fix skipping of change remote baud
In reply to Greg Kroah-HartmanFrom: Shahar Lev <[email protected]>
Before the incrementing of ptr in skip_change_remote_baud, it points to cur_action, but the increment is done by the size of nxt_action instead. This could cause ptr to not point to a bts_action structure, which is harmful for the increment of ptr done in download_firmware. Therefore, the skipping is first done for cur_action.
--- drivers/misc/ti-st/st_kim.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/misc/ti-st/st_kim.c +2 -2
@@ -245,9 +245,9 @@ void skip_change_remote_baud(unsigned char **ptr, long *len)pr_err ("invalid action after change remote baud command" ); }else { *ptr = *ptr +sizeof (struct bts_action ) + - ((struct bts_action *)nxt_action)->size; + ((struct bts_action *)cur_action)->size; *len = *len - (sizeof (struct bts_action ) + - ((struct bts_action *)nxt_action)->size); + ((struct bts_action *)cur_action)->size);/* warn user on not commenting these in firmware */ pr_warn ("skipping the wait event of change remote baud" ); }
Signature · 1 line
1.7.5.4
PATCH 5/9 pti: double-free security PTI fix
In reply to Greg Kroah-HartmanFrom: J Freyensee <[email protected]>
This patch fixes a double-free error that will not always be seen unless /dev/pti char interface is stressed.
--- drivers/misc/pti.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/misc/pti.c +3 -2
@@ -317,7 +317,8 @@ EXPORT_SYMBOL_GPL(pti_request_masterchannel);* a master, channel ID address * used to write to PTI HW. * -* @mc: master, channel apeture ID address to be released. +* @mc: master, channel apeture ID address to be released. This +* will de-allocate the structure via kfree(). */ void pti_release_masterchannel (struct pti_masterchannel *mc) {
@@ -581,7 +582,7 @@ static int pti_char_open(struct inode *inode, struct file *filp)static int pti_char_release (struct inode *inode,struct file *filp) {pti_release_masterchannel (filp->private_data); -kfree (filp->private_data); + filp->private_data =NULL ;return 0 ; }
Signature · 1 line
1.7.5.4
PATCH 6/9 pti: ENXIO error case memory leak PTI fix.
In reply to Greg Kroah-HartmanFrom: J Freyensee <[email protected]>
This patch fixes a memory leak that can occur in the error case ENXIO is returned in the pti_tty_install() routine.
--- drivers/misc/pti.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
drivers/misc/pti.c +3 -1
@@ -476,8 +476,10 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty)else pti_tty_data->mc =pti_request_masterchannel (2 ); -if (pti_tty_data->mc ==NULL ) +if (pti_tty_data->mc ==NULL ) { +kfree (pti_tty_data);return -ENXIO ; + } tty->driver_data = pti_tty_data; }
Signature · 1 line
1.7.5.4
PATCH 7/9 pti: PTI semantics fix in pti_tty_cleanup.
In reply to Greg Kroah-HartmanFrom: J Freyensee <[email protected]>
This patch fixes a semantics issue in the pti_tty_cleanup() routine.
--- drivers/misc/pti.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/misc/pti.c +1 -1
@@ -498,7 +498,7 @@ static void pti_tty_cleanup(struct tty_struct *tty)if (pti_tty_data ==NULL )return ;pti_release_masterchannel (pti_tty_data->mc); -kfree (tty->driver_data); +kfree (pti_tty_data); tty->driver_data =NULL ; }
Signature · 1 line
1.7.5.4