usb: gadget: f_fs: Use struct_size() and flex_array_size() helpers
authorGustavo A. R. Silva <gustavoars@kernel.org>
Thu, 20 Jan 2022 22:29:33 +0000 (16:29 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Jan 2022 13:02:15 +0000 (14:02 +0100)
Make use of the struct_size() and flex_array_size() helpers instead of
an open-coded version, in order to avoid any potential type mistakes
or integer overflows that, in the worst scenario, could lead to heap
overflows.

Also, address the following sparse warnings:
drivers/usb/gadget/function/f_fs.c:922:23: warning: using sizeof on a flexible structure

Link: https://github.com/KSPP/linux/issues/174
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/20220120222933.GA35155@embeddedor
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/f_fs.c

index 25ad1e97a458589363eb67fe15b1688faa171f0e..7461d27e9604a094b80ea1a3baab6ef5d3800b96 100644 (file)
@@ -919,12 +919,12 @@ static ssize_t __ffs_epfile_read_data(struct ffs_epfile *epfile,
                data_len, ret);
 
        data_len -= ret;
-       buf = kmalloc(sizeof(*buf) + data_len, GFP_KERNEL);
+       buf = kmalloc(struct_size(buf, storage, data_len), GFP_KERNEL);
        if (!buf)
                return -ENOMEM;
        buf->length = data_len;
        buf->data = buf->storage;
-       memcpy(buf->storage, data + ret, data_len);
+       memcpy(buf->storage, data + ret, flex_array_size(buf, storage, data_len));
 
        /*
         * At this point read_buffer is NULL or READ_BUFFER_DROP (if