mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
xen/xenbus: Add __counted_by for struct read_buffer and use struct_size()
Prepare for the coming implementation by GCC and Clang of the __counted_by attribute. Flexible array members annotated with __counted_by can have their accesses bounds-checked at run-time via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions). While there, use struct_size() helper, instead of the open-coded version, to calculate the size for the allocation of the whole flexible structure, including of course, the flexible-array member. This code was found with the help of Coccinelle, and audited and fixed manually. Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> Reviewed-by: Kees Cook <keescook@chromium.org> Reviewed-by: Jason Andryuk <jandryuk@gmail.com> Link: https://lore.kernel.org/r/ZSRMosLuJJS5Y/io@work Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
parent
44961b81a9
commit
d3a2b6b48f
@ -82,7 +82,7 @@ struct read_buffer {
|
|||||||
struct list_head list;
|
struct list_head list;
|
||||||
unsigned int cons;
|
unsigned int cons;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
char msg[];
|
char msg[] __counted_by(len);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct xenbus_file_priv {
|
struct xenbus_file_priv {
|
||||||
@ -195,7 +195,7 @@ static int queue_reply(struct list_head *queue, const void *data, size_t len)
|
|||||||
if (len > XENSTORE_PAYLOAD_MAX)
|
if (len > XENSTORE_PAYLOAD_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
rb = kmalloc(sizeof(*rb) + len, GFP_KERNEL);
|
rb = kmalloc(struct_size(rb, msg, len), GFP_KERNEL);
|
||||||
if (rb == NULL)
|
if (rb == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user