struct poll_wqueues table caused the stack usage of do_sys_poll() to grow beyond the warning limit on 32-bit architectures w/ gcc. fs/select.c: In function ‘do_sys_poll’: fs/select.c:1053:1: warning: the frame size of 1328 bytes is larger than 1024 bytes [-Wframe-larger-than=] Allocating dynamic memory in do_sys_poll() to fix this issue. Signed-off-by: Chao Yu <chao@xxxxxxxxxx> --- fs/select.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/select.c b/fs/select.c index 1b729494b4e9..2b9db5c938d9 100644 --- a/fs/select.c +++ b/fs/select.c @@ -982,7 +982,7 @@ static int do_poll(struct poll_list *list, struct poll_wqueues *wait, static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, struct timespec64 *end_time) { - struct poll_wqueues table; + struct poll_wqueues *table; int err = -EFAULT, fdcount, len; /* Allocate small arguments on the stack to save memory and be faster - use long to make sure the buffer is aligned properly @@ -992,8 +992,14 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, struct poll_list *walk = head; unsigned long todo = nfds; - if (nfds > rlimit(RLIMIT_NOFILE)) - return -EINVAL; + table = kmalloc(sizeof(struct poll_wqueues), GFP_KERNEL); + if (!table) + return -ENOMEM; + + if (nfds > rlimit(RLIMIT_NOFILE)) { + err = -EINVAL; + goto out_table; + } len = min_t(unsigned int, nfds, N_STACK_PPS); for (;;) { @@ -1019,9 +1025,9 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, } } - poll_initwait(&table); - fdcount = do_poll(head, &table, end_time); - poll_freewait(&table); + poll_initwait(table); + fdcount = do_poll(head, table, end_time); + poll_freewait(table); if (!user_write_access_begin(ufds, nfds * sizeof(*ufds))) goto out_fds; @@ -1043,7 +1049,8 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, walk = walk->next; kfree(pos); } - +out_table: + kfree(table); return err; Efault: -- 2.40.1