Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
RT-Thread
rt-thread
提交
31bfc855
R
rt-thread
项目概览
RT-Thread
/
rt-thread
大约 1 年 前同步成功
通知
795
Star
8912
Fork
4737
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
31bfc855
编写于
2月 28, 2023
作者:
W
wangxiaoyao
提交者:
guo
3月 02, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[syscall][fix] kernel overwrite ustack data in timer create
上级
892ef3dc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
37 addition
and
6 deletion
+37
-6
components/lwp/lwp_syscall.c
components/lwp/lwp_syscall.c
+37
-6
未找到文件。
components/lwp/lwp_syscall.c
浏览文件 @
31bfc855
...
...
@@ -18,6 +18,7 @@
#include <board.h>
#include <mm_aspace.h>
#include <string.h>
#include <stdint.h>
#include <lwp.h>
#ifdef ARCH_MM_MMU
...
...
@@ -1312,12 +1313,22 @@ rt_err_t sys_rt_timer_control(rt_timer_t timer, int cmd, void *arg)
return
rt_timer_control
(
timer
,
cmd
,
arg
);
}
/* MUSL compatible */
struct
ksigevent
{
union
sigval
sigev_value
;
int
sigev_signo
;
int
sigev_notify
;
int
sigev_tid
;
};
rt_err_t
sys_timer_create
(
clockid_t
clockid
,
struct
sigevent
*
restrict
sevp
,
timer_t
*
restrict
timerid
)
{
int
ret
=
0
;
#ifdef ARCH_MM_MMU
struct
sigevent
sevp_k
;
timer_t
timerid_k
;
int
utimer
;
if
(
sevp
==
NULL
)
{
...
...
@@ -1326,12 +1337,28 @@ rt_err_t sys_timer_create(clockid_t clockid, struct sigevent *restrict sevp, tim
sevp
=
&
sevp_k
;
}
else
lwp_get_from_user
(
&
sevp_k
,
(
void
*
)
sevp
,
sizeof
sevp_k
);
lwp_get_from_user
(
&
timerid_k
,
(
void
*
)
timerid
,
sizeof
timerid_k
);
{
/* clear extra bytes if any */
if
(
sizeof
(
struct
ksigevent
)
<
sizeof
(
struct
sigevent
))
memset
(
&
sevp_k
,
0
,
sizeof
(
sevp_k
));
/* musl passes `struct ksigevent` to kernel, we shoule only get size of that bytes */
lwp_get_from_user
(
&
sevp_k
,
(
void
*
)
sevp
,
sizeof
(
struct
ksigevent
));
}
lwp_get_from_user
(
&
timerid_k
,
(
void
*
)
timerid
,
sizeof
(
timerid_k
));
/* to protect unsafe implementation in current rt-smart toolchain */
RT_ASSERT
(((
struct
ksigevent
*
)
sevp
)
->
sigev_tid
==
(
rt_ubase_t
)
sevp_k
.
sigev_notify_function
);
ret
=
timer_create
(
clockid
,
&
sevp_k
,
&
timerid_k
);
/* ID should not extend 32-bits size for libc */
RT_ASSERT
((
rt_ubase_t
)
timerid_k
<
UINT32_MAX
);
utimer
=
(
rt_ubase_t
)
timerid_k
;
if
(
ret
!=
-
RT_ERROR
){
lwp_put_to_user
(
sevp
,
(
void
*
)
&
sevp_k
,
sizeof
sevp_k
);
lwp_put_to_user
(
timerid
,
(
void
*
)
&
timerid_k
,
sizeof
timerid_k
);
lwp_put_to_user
(
sevp
,
(
void
*
)
&
sevp_k
,
sizeof
(
struct
ksigevent
)
);
lwp_put_to_user
(
timerid
,
(
void
*
)
&
utimer
,
sizeof
(
utimer
)
);
}
#else
ret
=
timer_create
(
clockid
,
sevp
,
timerid
);
...
...
@@ -1354,8 +1381,12 @@ rt_err_t sys_timer_settime(timer_t timerid, int flags,
struct
itimerspec
new_value_k
;
struct
itimerspec
old_value_k
;
lwp_get_from_user
(
&
new_value_k
,
(
void
*
)
new_value
,
sizeof
new_value_k
);
lwp_get_from_user
(
&
old_value_k
,
(
void
*
)
timerid
,
sizeof
old_value_k
);
if
(
!
lwp_get_from_user
(
&
new_value_k
,
(
void
*
)
new_value
,
sizeof
(
*
new_value
))
||
(
old_value
&&
!
lwp_get_from_user
(
&
old_value_k
,
(
void
*
)
old_value
,
sizeof
(
*
old_value
))))
{
return
-
EFAULT
;
}
ret
=
timer_settime
(
timerid
,
flags
,
&
new_value_k
,
&
old_value_k
);
lwp_put_to_user
(
old_value
,
(
void
*
)
&
old_value_k
,
sizeof
old_value_k
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录