diff options
author | Gustavo A. R. Silva <gustavo@embeddedor.com> | 2019-07-16 19:30:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-07-16 22:23:25 -0400 |
commit | 43e11fa2d1d3b6e35629fa556eb7d571edba2010 (patch) | |
tree | e031de3623167cd0fa10f8de744b24627885e4e8 | |
parent | 79eb597cba06c435b72f220e9d426ae413fc2579 (diff) |
fs/select.c: use struct_size() in kmalloc()
One of the more common cases of allocation size calculations is finding
the size of a structure that has a zero-sized array at the end, along
with memory for some number of elements for that array. For example:
struct foo {
int stuff;
struct boo entry[];
};
size = sizeof(struct foo) + count * sizeof(struct boo);
instance = kmalloc(size, GFP_KERNEL);
Instead of leaving these open-coded and prone to type mistakes, we can now
use the new struct_size() helper:
instance = kmalloc(struct_size(instance, entry, count), GFP_KERNEL);
Also, notice that variable size is unnecessary, hence it is removed.
This code was detected with the help of Coccinelle.
Link: http://lkml.kernel.org/r/20190604164226.GA13823@embeddedor
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | fs/select.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/select.c b/fs/select.c index 51ceec292f2f..53a0c149f528 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -961,7 +961,7 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
961 | struct timespec64 *end_time) | 961 | struct timespec64 *end_time) |
962 | { | 962 | { |
963 | struct poll_wqueues table; | 963 | struct poll_wqueues table; |
964 | int err = -EFAULT, fdcount, len, size; | 964 | int err = -EFAULT, fdcount, len; |
965 | /* Allocate small arguments on the stack to save memory and be | 965 | /* Allocate small arguments on the stack to save memory and be |
966 | faster - use long to make sure the buffer is aligned properly | 966 | faster - use long to make sure the buffer is aligned properly |
967 | on 64 bit archs to avoid unaligned access */ | 967 | on 64 bit archs to avoid unaligned access */ |
@@ -989,8 +989,8 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
989 | break; | 989 | break; |
990 | 990 | ||
991 | len = min(todo, POLLFD_PER_PAGE); | 991 | len = min(todo, POLLFD_PER_PAGE); |
992 | size = sizeof(struct poll_list) + sizeof(struct pollfd) * len; | 992 | walk = walk->next = kmalloc(struct_size(walk, entries, len), |
993 | walk = walk->next = kmalloc(size, GFP_KERNEL); | 993 | GFP_KERNEL); |
994 | if (!walk) { | 994 | if (!walk) { |
995 | err = -ENOMEM; | 995 | err = -ENOMEM; |
996 | goto out_fds; | 996 | goto out_fds; |