Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party NuttX
提交
13936231
T
Third Party NuttX
项目概览
OpenHarmony
/
Third Party NuttX
大约 1 年 前同步成功
通知
5
Star
19
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party NuttX
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
13936231
编写于
7月 13, 2021
作者:
O
openharmony_ci
提交者:
Gitee
7月 13, 2021
浏览文件
操作
浏览文件
下载
差异文件
!52 多进程情况下,pipe的内核操作节点存在使用脏私有字段dev,导致系统概率异常
Merge pull request !52 from zhangfanfan2/master
上级
6bca8e20
dff4961f
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
46 addition
and
12 deletion
+46
-12
drivers/pipes/pipe.c
drivers/pipes/pipe.c
+46
-12
未找到文件。
drivers/pipes/pipe.c
浏览文件 @
13936231
...
@@ -223,6 +223,37 @@ static int pipe_close(struct file *filep)
...
@@ -223,6 +223,37 @@ static int pipe_close(struct file *filep)
*
*
****************************************************************************/
****************************************************************************/
static
void
UpdateDev
(
struct
pipe_dev_s
*
dev
)
{
int
ret
;
struct
Vnode
*
vnode
=
NULL
;
struct
pipe_dev_s
*
olddev
=
NULL
;
struct
drv_data
*
data
=
NULL
;
VnodeHold
();
ret
=
VnodeLookup
(
dev
->
name
,
&
vnode
,
0
);
if
(
ret
!=
0
)
{
VnodeDrop
();
PRINT_ERR
(
"[%s,%d] failed. err: %d
\n
"
,
__FUNCTION__
,
__LINE__
,
ret
);
return
;
}
data
=
(
struct
drv_data
*
)
vnode
->
data
;
olddev
=
(
struct
pipe_dev_s
*
)
data
->
priv
;
if
(
olddev
!=
NULL
)
{
if
(
olddev
->
d_buffer
!=
NULL
)
{
free
(
olddev
->
d_buffer
);
olddev
->
d_buffer
=
NULL
;
}
pipecommon_freedev
(
olddev
);
}
data
->
priv
=
dev
;
VnodeDrop
();
return
;
}
int
pipe
(
int
fd
[
2
])
int
pipe
(
int
fd
[
2
])
{
{
struct
pipe_dev_s
*
dev
=
NULL
;
struct
pipe_dev_s
*
dev
=
NULL
;
...
@@ -256,10 +287,6 @@ int pipe(int fd[2])
...
@@ -256,10 +287,6 @@ int pipe(int fd[2])
snprintf_s
(
devname
,
sizeof
(
devname
),
sizeof
(
devname
)
-
1
,
"/dev/pipe%d"
,
pipeno
);
snprintf_s
(
devname
,
sizeof
(
devname
),
sizeof
(
devname
)
-
1
,
"/dev/pipe%d"
,
pipeno
);
/* Check if the pipe device has already been created */
if
((
g_pipecreated
&
(
1
<<
pipeno
))
==
0
)
{
/* No.. Allocate and initialize a new device structure instance */
/* No.. Allocate and initialize a new device structure instance */
dev
=
pipecommon_allocdev
(
bufsize
,
devname
);
dev
=
pipecommon_allocdev
(
bufsize
,
devname
);
...
@@ -272,6 +299,10 @@ int pipe(int fd[2])
...
@@ -272,6 +299,10 @@ int pipe(int fd[2])
dev
->
d_pipeno
=
pipeno
;
dev
->
d_pipeno
=
pipeno
;
/* Check if the pipe device has already been created */
if
((
g_pipecreated
&
(
1
<<
pipeno
))
==
0
)
{
/* Register the pipe device */
/* Register the pipe device */
ret
=
register_driver
(
devname
,
&
pipe_fops
,
0660
,
(
void
*
)
dev
);
ret
=
register_driver
(
devname
,
&
pipe_fops
,
0660
,
(
void
*
)
dev
);
...
@@ -286,7 +317,10 @@ int pipe(int fd[2])
...
@@ -286,7 +317,10 @@ int pipe(int fd[2])
g_pipecreated
|=
(
1
<<
pipeno
);
g_pipecreated
|=
(
1
<<
pipeno
);
}
}
else
{
UpdateDev
(
dev
);
}
(
void
)
sem_post
(
&
g_pipesem
);
(
void
)
sem_post
(
&
g_pipesem
);
/* Get a write file descriptor */
/* Get a write file descriptor */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录