diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
| -rw-r--r-- | drivers/hid/hid-input.c | 11 | 
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index b420f4a0fd28..8741d953dcc8 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -485,6 +485,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  	if (field->flags & HID_MAIN_ITEM_CONSTANT)  		goto ignore; +	/* Ignore if report count is out of bounds. */ +	if (field->report_count < 1) +		goto ignore; +  	/* only LED usages are supported in output fields */  	if (field->report_type == HID_OUTPUT_REPORT &&  			(usage->hid & HID_USAGE_PAGE) != HID_UP_LED) { @@ -1236,7 +1240,11 @@ static void report_features(struct hid_device *hid)  	rep_enum = &hid->report_enum[HID_FEATURE_REPORT];  	list_for_each_entry(rep, &rep_enum->report_list, list) -		for (i = 0; i < rep->maxfield; i++) +		for (i = 0; i < rep->maxfield; i++) { +			/* Ignore if report count is out of bounds. */ +			if (rep->field[i]->report_count < 1) +				continue; +  			for (j = 0; j < rep->field[i]->maxusage; j++) {  				/* Verify if Battery Strength feature is available */  				hidinput_setup_battery(hid, HID_FEATURE_REPORT, rep->field[i]); @@ -1245,6 +1253,7 @@ static void report_features(struct hid_device *hid)  					drv->feature_mapping(hid, rep->field[i],  							     rep->field[i]->usage + j);  			} +		}  }  static struct hid_input *hidinput_allocate(struct hid_device *hid)  | 
