lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 17 Feb 2010 10:28:12 -0700
From:	"Rick L. Vinyard, Jr." <rvinyard@...nmsu.edu>
To:	"Linux" <linux-kernel@...r.kernel.org>,
	"Linux USB" <linux-usb@...r.kernel.org>
Subject: Problem with modification to hid_post_reset

Following is a short patch that I've been using to add hooks before and
after device reset. I probably won't end up needing the post_reset_finish
hook but I have it there for testing right now.

The first hook I need so I can set a flag that is dealt with on the first
raw event, and I need to ensure the flag is set prior to queue restart.

>From what I can tell, these shouldn't cause any problems... they should be
trivial but they are causing a kernel fault on resume from a suspend.

The enclosed patch probably has line wrapping problems. If someone wants
to test it I'll send a more proper patch, but I thought I'd throw it out
there and see if anyone sees anything obvious.

Thanks,

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index e2997a8..bfd698c 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1221,6 +1221,9 @@ static int hid_post_reset(struct usb_interface *intf)
 	struct usbhid_device *usbhid = hid->driver_data;
 	int status;

+	if (hid->driver && hid->driver->post_reset_start)
+		hid->driver->post_reset_start(hid);
+
 	spin_lock_irq(&usbhid->lock);
 	clear_bit(HID_RESET_PENDING, &usbhid->iofl);
 	spin_unlock_irq(&usbhid->lock);
@@ -1230,6 +1233,9 @@ static int hid_post_reset(struct usb_interface *intf)
 		hid_io_error(hid);
 	usbhid_restart_queues(usbhid);

+	if (hid->driver && hid->driver->post_reset_finish)
+		hid->driver->post_reset_finish(hid);
+
 	return 0;
 }

diff --git a/include/linux/hid.h b/include/linux/hid.h
index 8709365..15c511c 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -629,6 +631,10 @@ struct hid_driver {
 	int (*input_mapped)(struct hid_device *hdev,
 			struct hid_input *hidinput, struct hid_field *field,
 			struct hid_usage *usage, unsigned long **bit, int *max);
+
+	void (*post_reset_start)(struct hid_device *hdev);
+	void (*post_reset_finish)(struct hid_device *hdev);
+
 /* private: */
 	struct device_driver driver;
 };


---- G13 code ----

#define hid_get_g13data(hdev) \
	((struct g13_data *)(hid_get_drvdata(hdev)))

static void g13_post_reset_start(struct hid_device *hdev)
{
	struct g13_data *data;

	/* Get the underlying data value */
	data = hid_get_g13data(hdev);
	/* need_reset is declared as int */
	data->need_reset = 1;
}

static void g13_post_reset_finish(struct hid_device *hdev)
{
}

static struct hid_driver g13_driver = {
	.name 			= "hid-g13",
	.id_table 		= g13_devices,
	.probe 			= g13_probe,
	.remove 		= g13_remove,
	.raw_event 		= g13_raw_event,
 	.post_reset_start 	= g13_post_reset_start,
  	.post_reset_finish	= g13_post_reset_finish,
};



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ