Instead of embedding a pointer in the struct, use a flexible array member to avoid the + 1 trick to point to allocation after the struct.
Signed-off-by: Rosen Penev <[email protected]> --- drivers/hid/hid-core.c | 6 ++---- include/linux/hid.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 840a60113868..6bd6cbf26c6d 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -127,15 +127,13 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned return NULL; } - field = kvzalloc((sizeof(struct hid_field) + - usages * sizeof(struct hid_usage) + - 3 * usages * sizeof(unsigned int)), GFP_KERNEL); + field = kvzalloc(struct_size(field, usage, usages) + + 3 * usages * sizeof(unsigned int), GFP_KERNEL); if (!field) return NULL; field->index = report->maxfield++; report->field[field->index] = field; - field->usage = (struct hid_usage *)(field + 1); field->value = (s32 *)(field->usage + usages); field->new_value = (s32 *)(field->value + usages); field->usages_priorities = (s32 *)(field->new_value + usages); diff --git a/include/linux/hid.h b/include/linux/hid.h index 2990b9f94cb5..e2c3e2528582 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h @@ -524,7 +524,6 @@ struct hid_field { unsigned physical; /* physical usage for this field */ unsigned logical; /* logical usage for this field */ unsigned application; /* application usage for this field */ - struct hid_usage *usage; /* usage table for this function */ unsigned maxusage; /* maximum usage index */ unsigned flags; /* main-item flags (i.e. volatile,array,constant) */ unsigned report_offset; /* bit offset in the report */ @@ -549,6 +548,7 @@ struct hid_field { struct hid_input *hidinput; /* associated input structure */ __u16 dpad; /* dpad input code */ unsigned int slot_idx; /* slot index in a report */ + struct hid_usage usage[]; /* usage table for this function */ }; #define HID_MAX_FIELDS 256 -- 2.53.0

