staging: unisys: check the whole channel instead of just guid for match

Validate that the channel contents match the channel type that we are
matching.

Signed-off-by: Sameer Wadgaonkar <sameer.wadgaonkar@unisys.com>
Signed-off-by: David Kershner <david.kershner@unisys.com>
Reviewed-by: Tim Sell <timothy.sell@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Sameer Wadgaonkar 2017-09-27 13:14:43 -04:00 committed by Greg Kroah-Hartman
parent 66040f9104
commit cb3b5dccca
4 changed files with 17 additions and 5 deletions

View File

@ -143,14 +143,23 @@ static int visorbus_match(struct device *xdev, struct device_driver *xdrv)
int i; int i;
struct visor_device *dev; struct visor_device *dev;
struct visor_driver *drv; struct visor_driver *drv;
struct visorchannel *chan;
dev = to_visor_device(xdev); dev = to_visor_device(xdev);
channel_type = visorchannel_get_guid(dev->visorchannel); channel_type = visorchannel_get_guid(dev->visorchannel);
drv = to_visor_driver(xdrv); drv = to_visor_driver(xdrv);
chan = dev->visorchannel;
if (!drv->channel_types) if (!drv->channel_types)
return 0; return 0;
for (i = 0; !guid_is_null(&drv->channel_types[i].guid); i++) for (i = 0; !guid_is_null(&drv->channel_types[i].guid); i++)
if (guid_equal(&drv->channel_types[i].guid, channel_type)) if (guid_equal(&drv->channel_types[i].guid, channel_type) &&
visor_check_channel(visorchannel_get_header(chan),
xdev,
&drv->channel_types[i].guid,
(char *)drv->channel_types[i].name,
drv->channel_types[i].min_bytes,
drv->channel_types[i].version,
VISOR_CHANNEL_SIGNATURE))
return i + 1; return i + 1;
return 0; return 0;
} }

View File

@ -40,7 +40,8 @@ static struct visor_channeltype_descriptor visorhba_channel_types[] = {
/* Note that the only channel type we expect to be reported by the /* Note that the only channel type we expect to be reported by the
* bus driver is the VISOR_VHBA channel. * bus driver is the VISOR_VHBA channel.
*/ */
{ VISOR_VHBA_CHANNEL_GUID, "sparvhba" }, { VISOR_VHBA_CHANNEL_GUID, "sparvhba", sizeof(struct channel_header),
VISOR_VHBA_CHANNEL_VERSIONID },
{} {}
}; };

View File

@ -712,8 +712,9 @@ out:
/* GUIDS for all channel types supported by this driver. */ /* GUIDS for all channel types supported by this driver. */
static struct visor_channeltype_descriptor visorinput_channel_types[] = { static struct visor_channeltype_descriptor visorinput_channel_types[] = {
{ VISOR_KEYBOARD_CHANNEL_GUID, "keyboard"}, { VISOR_KEYBOARD_CHANNEL_GUID, "keyboard",
{ VISOR_MOUSE_CHANNEL_GUID, "mouse"}, sizeof(struct channel_header), 0 },
{ VISOR_MOUSE_CHANNEL_GUID, "mouse", sizeof(struct channel_header), 0 },
{} {}
}; };

View File

@ -49,7 +49,8 @@ static struct visor_channeltype_descriptor visornic_channel_types[] = {
/* Note that the only channel type we expect to be reported by the /* Note that the only channel type we expect to be reported by the
* bus driver is the VISOR_VNIC channel. * bus driver is the VISOR_VNIC channel.
*/ */
{ VISOR_VNIC_CHANNEL_GUID, "ultravnic" }, { VISOR_VNIC_CHANNEL_GUID, "ultravnic", sizeof(struct channel_header),
VISOR_VNIC_CHANNEL_VERSIONID },
{} {}
}; };
MODULE_DEVICE_TABLE(visorbus, visornic_channel_types); MODULE_DEVICE_TABLE(visorbus, visornic_channel_types);