aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2007-11-14 05:31:05 -0500
committerJiri Kosina <jkosina@suse.cz>2008-01-28 08:51:19 -0500
commit3ba5619f06300cd0944150901ed20de87483ad8c (patch)
tree2fab950f6766fc7c5d2242ac6063ee92c4e8e546 /drivers
parentc80e5ffac0579499ca28444155118ffcdd9b8d7e (diff)
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')
-rw-r--r--drivers/hid/usbhid/hid-tmff.c7
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
137int hid_tmff_init(struct hid_device *hid) 137int hid_tmff_init(struct hid_device *hid)
138{ 138{
139 struct tmff_device *tmff; 139 struct tmff_device *tmff;
140 struct list_head *pos; 140 struct hid_report *report;
141 struct list_head *report_list;
141 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); 142 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list);
142 struct input_dev *input_dev = hidinput->input; 143 struct input_dev *input_dev = hidinput->input;
143 const signed short *ff_bits = ff_joystick; 144 const signed short *ff_bits = ff_joystick;
@@ -149,8 +150,8 @@ int hid_tmff_init(struct hid_device *hid)
149 return -ENOMEM; 150 return -ENOMEM;
150 151
151 /* Find the report to use */ 152 /* Find the report to use */
152 list_for_each(pos, &hid->report_enum[HID_OUTPUT_REPORT].report_list) { 153 report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
153 struct hid_report *report = (struct hid_report *)pos; 154 list_for_each_entry(report, report_list, list) {
154 int fieldnum; 155 int fieldnum;
155 156
156 for (fieldnum = 0; fieldnum < report->maxfield; ++fieldnum) { 157 for (fieldnum = 0; fieldnum < report->maxfield; ++fieldnum) {