diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2007-11-14 11:31:05 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2008-01-28 14:51:19 +0100 |
commit | 3ba5619f06300cd0944150901ed20de87483ad8c (patch) | |
tree | 2fab950f6766fc7c5d2242ac6063ee92c4e8e546 /drivers/hid | |
parent | c80e5ffac0579499ca28444155118ffcdd9b8d7e (diff) | |
download | linux-3ba5619f06300cd0944150901ed20de87483ad8c.tar.gz linux-3ba5619f06300cd0944150901ed20de87483ad8c.tar.bz2 linux-3ba5619f06300cd0944150901ed20de87483ad8c.zip |
HID: fix a potential bug in pointer casting
Don't directly cast list_head * to foo *, this works only when list
is the first member of struct foo, and we should not make the assumption
how members are ordered in the structure.
i.e. struct *f = (struct *f)pos will work if:
struct foo {
struct list_head list;
int i;
};
but will fail if:
struct foo {
int i;
struct list_head list;
}
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/usbhid/hid-tmff.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/hid/usbhid/hid-tmff.c b/drivers/hid/usbhid/hid-tmff.c index 69882a726e99..144578b1a00c 100644 --- a/drivers/hid/usbhid/hid-tmff.c +++ b/drivers/hid/usbhid/hid-tmff.c @@ -137,7 +137,8 @@ static int hid_tmff_play(struct input_dev *dev, void *data, struct ff_effect *ef int hid_tmff_init(struct hid_device *hid) { struct tmff_device *tmff; - struct list_head *pos; + struct hid_report *report; + struct list_head *report_list; struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); struct input_dev *input_dev = hidinput->input; const signed short *ff_bits = ff_joystick; @@ -149,8 +150,8 @@ int hid_tmff_init(struct hid_device *hid) return -ENOMEM; /* Find the report to use */ - list_for_each(pos, &hid->report_enum[HID_OUTPUT_REPORT].report_list) { - struct hid_report *report = (struct hid_report *)pos; + report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; + list_for_each_entry(report, report_list, list) { int fieldnum; for (fieldnum = 0; fieldnum < report->maxfield; ++fieldnum) { |