From baeda8fed759da552c3f15dd570e00eafbcba124 Mon Sep 17 00:00:00 2001 From: xieyangrun Date: Wed, 30 Nov 2022 10:50:58 +0800 Subject: [PATCH 1/2] fixed sys_stat --- components/lwp/lwp_syscall.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 89a8a928c9..65e6b546e6 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -917,7 +917,7 @@ int sys_nanosleep(const struct timespec *rqtp, struct timespec *rmtp) #ifdef RT_USING_USERSPACE struct timespec rqtp_k; struct timespec rmtp_k; - + lwp_get_from_user(&rqtp_k, (void *)rqtp, sizeof rqtp_k); ret = nanosleep(&rqtp_k, &rmtp_k); if ((ret != -1 || rt_get_errno() == EINTR) && rmtp && lwp_user_accessable((void *)rmtp, sizeof *rmtp)) @@ -1739,7 +1739,7 @@ int _sys_fork(void) LOG_E("malloc fail!\n"); goto fail; } - + lwp->tty->foreground = lwp; } rt_hw_interrupt_enable(level); @@ -2491,7 +2491,20 @@ int sys_log(const char* log, int size) int sys_stat(const char *file, struct stat *buf) { int ret = 0; - ret = stat(file, buf); + struct stat statbuff; + + if (!lwp_user_accessable((void *)buf, sizeof(struct stat))) + { + return -EFAULT; + } + + ret = stat(file, &statbuff); + + if (ret == 0) + { + lwp_put_to_user(buf, &statbuff, sizeof statbuff); + } + return (ret < 0 ? GET_ERRNO() : ret); } @@ -4100,7 +4113,7 @@ int sys_sched_get_priority_max(int policy) { rt_set_errno(EINVAL); return -rt_get_errno(); - } + } return RT_THREAD_PRIORITY_MAX; } -- Gitee From acaa58fd26969db4a8fe535ae4da616185d46266 Mon Sep 17 00:00:00 2001 From: xieyangrun Date: Wed, 30 Nov 2022 12:09:55 +0800 Subject: [PATCH 2/2] fixed sys_stat --- components/lwp/lwp_syscall.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 65e6b546e6..a443ea9967 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -2491,6 +2491,10 @@ int sys_log(const char* log, int size) int sys_stat(const char *file, struct stat *buf) { int ret = 0; + int err; + size_t len; + size_t copy_len; + char *copy_path; struct stat statbuff; if (!lwp_user_accessable((void *)buf, sizeof(struct stat))) @@ -2498,7 +2502,28 @@ int sys_stat(const char *file, struct stat *buf) return -EFAULT; } - ret = stat(file, &statbuff); + len = lwp_user_strlen(file, &err); + if (err) + { + return -EFAULT; + } + + copy_path = (char*)rt_malloc(len + 1); + if (!copy_path) + { + return -ENOMEM; + } + + copy_len = lwp_get_from_user(copy_path, (void*)file, len); + if (copy_len == 0) + { + rt_free(copy_path); + return -EFAULT; + } + copy_path[copy_len] = '\0'; + + ret = stat(copy_path, &statbuff); + rt_free(copy_path); if (ret == 0) { -- Gitee