Re: [PATCH 1/4] HID: intel-ish-hid: avoid binding wrong ishtp_cl_device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2019-02-13 at 23:56 +0100, Jiri Kosina wrote:
> On Tue, 12 Feb 2019, Hong Liu wrote:
> 
> > When performing a warm reset in ishtp bus driver, the
> > ishtp_cl_device
> > will not be removed, its fw_client still points to the already
> > freed
> > ishtp_device.fw_clients array.
> > 
> > Later after driver finishing ishtp client enumeration, this
> > dangling
> > pointer may cause driver to bind the wrong ishtp_cl_device to the
> > new
> > client, causing wrong callback to be called for messages intended
> > for
> > the new client.
> > 
> > This helps in development of firmware where frequent switching of
> > firmwares is required without Linux reboot.
> > 
> > Signed-off-by: Hong Liu <hong.liu@xxxxxxxxx>
> > Tested-by: Hongyan Song <hongyan.song@xxxxxxxxx>
> 
> Srinivas, could you please ack this series? Thanks.
Just did. I looked at these patches before during our internal reviews.

Thanks,
Srinivas

> 
> > ---
> >  drivers/hid/intel-ish-hid/ishtp/bus.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c
> > b/drivers/hid/intel-ish-hid/ishtp/bus.c
> > index 728dc6d4561a..a271d6d169b1 100644
> > --- a/drivers/hid/intel-ish-hid/ishtp/bus.c
> > +++ b/drivers/hid/intel-ish-hid/ishtp/bus.c
> > @@ -675,7 +675,8 @@ int ishtp_cl_device_bind(struct ishtp_cl *cl)
> >  	spin_lock_irqsave(&cl->dev->device_list_lock, flags);
> >  	list_for_each_entry(cl_device, &cl->dev->device_list,
> >  			device_link) {
> > -		if (cl_device->fw_client->client_id == cl-
> > >fw_client_id) {
> > +		if (cl_device->fw_client &&
> > +		    cl_device->fw_client->client_id == cl-
> > >fw_client_id) {
> >  			cl->device = cl_device;
> >  			rv = 0;
> >  			break;
> > @@ -735,6 +736,7 @@ void ishtp_bus_remove_all_clients(struct
> > ishtp_device *ishtp_dev,
> >  	spin_lock_irqsave(&ishtp_dev->device_list_lock, flags);
> >  	list_for_each_entry_safe(cl_device, n, &ishtp_dev->device_list,
> >  				 device_link) {
> > +		cl_device->fw_client = NULL;
> >  		if (warm_reset && cl_device->reference_count)
> >  			continue;
> >  
> > -- 
> > 2.20.1
> > 
> 
> 




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux