Use the proper function to allocate a struct with a flexible array member. Add __counted_by for extra runtime analysis. Add counting variable assignment as required by __counted_by.
Signed-off-by: Rosen Penev <[email protected]> --- drivers/siox/siox-core.c | 5 +++-- drivers/siox/siox.h | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c index 3e8f3b6a4555..b87e2a12d640 100644 --- a/drivers/siox/siox-core.c +++ b/drivers/siox/siox-core.c @@ -689,10 +689,11 @@ struct siox_master *siox_master_alloc(struct device *dev, if (!dev) return NULL; - smaster = kzalloc(sizeof(*smaster) + size, GFP_KERNEL); + smaster = kzalloc_flex(*smaster, buf, size); if (!smaster) return NULL; + smaster->buf_len = size; device_initialize(&smaster->dev); smaster->busno = -1; @@ -854,7 +855,7 @@ static struct siox_device *siox_device_add(struct siox_master *smaster, } smaster->buf_len = buf_len; - smaster->buf = buf; + memcpy(smaster->buf, buf, buf_len); } ret = device_register(&sdevice->dev); diff --git a/drivers/siox/siox.h b/drivers/siox/siox.h index 513f2c8312f7..e6809fcafa0f 100644 --- a/drivers/siox/siox.h +++ b/drivers/siox/siox.h @@ -27,11 +27,12 @@ struct siox_master { size_t setbuf_len, getbuf_len; size_t buf_len; - u8 *buf; u8 status; unsigned long last_poll; struct task_struct *poll_thread; + + u8 buf[] __counted_by(buf_len); }; static inline void *siox_master_get_devdata(struct siox_master *smaster) -- 2.53.0

