From d7a9921ad5be1810e5614ba4018428afb4d7e055 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Mon, 7 Dec 2020 18:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3sys=5Fselect=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=AF=B9nfds=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/lwp/lwp_syscall.c | 48 +++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index bb2f4b8396..3513aafacb 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -417,46 +417,70 @@ int sys_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, s if (readfds) { - if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)readfds, nfds * sizeof *readfds)) + if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)readfds, sizeof *readfds)) + { return -1; - kreadfds = (fd_set *)kmem_get(nfds * sizeof *kreadfds); + } + kreadfds = (fd_set *)kmem_get(sizeof *kreadfds); if (!kreadfds) + { goto quit; - lwp_data_get(&lwp_self()->mmu_info, kreadfds, readfds, nfds * sizeof *kreadfds); + } + lwp_data_get(&lwp_self()->mmu_info, kreadfds, readfds, sizeof *kreadfds); } if (writefds) { - if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)writefds, nfds * sizeof *writefds)) + if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)writefds, sizeof *writefds)) + { return -1; - kwritefds = (fd_set *)kmem_get(nfds * sizeof *kwritefds); + } + kwritefds = (fd_set *)kmem_get(sizeof *kwritefds); if (!kwritefds) + { goto quit; - lwp_data_get(&lwp_self()->mmu_info, kwritefds, writefds, nfds * sizeof *kwritefds); + } + lwp_data_get(&lwp_self()->mmu_info, kwritefds, writefds, sizeof *kwritefds); } if (exceptfds) { - if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)exceptfds, nfds * sizeof *exceptfds)) + if (!lwp_data_access_ok(&lwp_self()->mmu_info, (void*)exceptfds, sizeof *exceptfds)) + { return -1; - kexceptfds = (fd_set *)kmem_get(nfds * sizeof *kexceptfds); + } + kexceptfds = (fd_set *)kmem_get(sizeof *kexceptfds); if (!kexceptfds) + { goto quit; - lwp_data_get(&lwp_self()->mmu_info, kexceptfds, exceptfds, nfds * sizeof *kexceptfds); + } + lwp_data_get(&lwp_self()->mmu_info, kexceptfds, exceptfds, sizeof *kexceptfds); } ret = select(nfds, kreadfds, kwritefds, kexceptfds, timeout); if (kreadfds) - lwp_data_put(&lwp_self()->mmu_info, readfds, kreadfds, nfds * sizeof *kreadfds); + { + lwp_data_put(&lwp_self()->mmu_info, readfds, kreadfds, sizeof *kreadfds); + } if (kwritefds) - lwp_data_put(&lwp_self()->mmu_info, writefds, kwritefds, nfds * sizeof *kwritefds); + { + lwp_data_put(&lwp_self()->mmu_info, writefds, kwritefds, sizeof *kwritefds); + } if (kexceptfds) - lwp_data_put(&lwp_self()->mmu_info, exceptfds, kexceptfds, nfds * sizeof *kexceptfds); + { + lwp_data_put(&lwp_self()->mmu_info, exceptfds, kexceptfds, sizeof *kexceptfds); + } quit: if (kreadfds) + { kmem_put(kreadfds); + } if (kwritefds) + { kmem_put(kwritefds); + } if (kexceptfds) + { kmem_put(kexceptfds); + } return ret; #else return select(nfds, readfds, writefds, exceptfds, timeout); -- Gitee