Commit cb3b5dcc authored by Sameer Wadgaonkar's avatar Sameer Wadgaonkar Committed by Greg Kroah-Hartman
Browse files

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: default avatarSameer Wadgaonkar <sameer.wadgaonkar@unisys.com>
Signed-off-by: default avatarDavid Kershner <david.kershner@unisys.com>
Reviewed-by: default avatarTim Sell <timothy.sell@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 66040f91
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -143,14 +143,23 @@ static int visorbus_match(struct device *xdev, struct device_driver *xdrv)
	int i;
	struct visor_device *dev;
	struct visor_driver *drv;
	struct visorchannel *chan;

	dev = to_visor_device(xdev);
	channel_type = visorchannel_get_guid(dev->visorchannel);
	drv = to_visor_driver(xdrv);
	chan = dev->visorchannel;
	if (!drv->channel_types)
		return 0;
	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 0;
}
+2 −1
Original line number Diff line number Diff line
@@ -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
	 * 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 },
	{}
};

+3 −2
Original line number Diff line number Diff line
@@ -712,8 +712,9 @@ out:

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

+2 −1
Original line number Diff line number Diff line
@@ -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
	 * 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);