Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
16f8032c
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
接近 2 年 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
16f8032c
编写于
3月 31, 2023
作者:
O
openharmony_ci
提交者:
Gitee
3月 31, 2023
浏览文件
操作
浏览文件
下载
差异文件
!829 Move sigchain’s sigmask from sigprocmask to pthread_sigmask
Merge pull request !829 from dhy308/release_sigchain_0225
上级
423de4bb
fd4f7e43
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
749 addition
and
199 deletion
+749
-199
libc-test/src/functionalext/common/sigchain_util.h
libc-test/src/functionalext/common/sigchain_util.h
+3
-8
libc-test/src/functionalext/sigchain/sigchain_add_special_handler.c
...src/functionalext/sigchain/sigchain_add_special_handler.c
+165
-38
libc-test/src/functionalext/sigchain/sigchain_handler_call_order.c
.../src/functionalext/sigchain/sigchain_handler_call_order.c
+16
-15
libc-test/src/functionalext/sigchain/sigchain_intercept_pthread_sigmask.c
...nctionalext/sigchain/sigchain_intercept_pthread_sigmask.c
+180
-0
libc-test/src/functionalext/sigchain/sigchain_intercept_sigaction.c
...src/functionalext/sigchain/sigchain_intercept_sigaction.c
+19
-13
libc-test/src/functionalext/sigchain/sigchain_intercept_signal.c
...st/src/functionalext/sigchain/sigchain_intercept_signal.c
+14
-17
libc-test/src/functionalext/sigchain/sigchain_rm_special_handler.c
.../src/functionalext/sigchain/sigchain_rm_special_handler.c
+110
-40
libc-test/src/functionalext/sigchain/test_src_functionalext_sigchain.gni
...unctionalext/sigchain/test_src_functionalext_sigchain.gni
+1
-1
libc.map.txt
libc.map.txt
+2
-0
musl_src.gni
musl_src.gni
+2
-1
porting/linux/user/include/sigchain.h
porting/linux/user/include/sigchain.h
+5
-1
porting/linux/user/src/sigchain/sigchain.c
porting/linux/user/src/sigchain/sigchain.c
+107
-19
porting/linux/user/src/signal/sigaction.c
porting/linux/user/src/signal/sigaction.c
+17
-1
porting/linux/user/src/signal/siginterrupt.c
porting/linux/user/src/signal/siginterrupt.c
+34
-0
porting/linux/user/src/signal/sigprocmask.c
porting/linux/user/src/signal/sigprocmask.c
+0
-45
porting/linux/user/src/thread/pthread_sigmask.c
porting/linux/user/src/thread/pthread_sigmask.c
+74
-0
未找到文件。
libc-test/src/functionalext/common/sigchain_util.h
浏览文件 @
16f8032c
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
EXPECT_FALSE(fun, true); \
EXPECT_FALSE(fun, true); \
} \
} \
} \
} \
result =
sigproc
mask(SIG_BLOCK, &set, NULL); \
result =
pthread_sig
mask(SIG_BLOCK, &set, NULL); \
if (result != 0) { \
if (result != 0) { \
EXPECT_FALSE(fun, true); \
EXPECT_FALSE(fun, true); \
} \
} \
...
@@ -38,16 +38,11 @@
...
@@ -38,16 +38,11 @@
#define SIGCHIAN_TEST_SIGNAL_NUM_2 2
#define SIGCHIAN_TEST_SIGNAL_NUM_2 2
#define SIGCHIAN_TEST_SIGNAL_NUM_3 3
#define SIGCHIAN_TEST_SIGNAL_NUM_3 3
#define SIGCHIAN_TEST_SIGNAL_NUM_4 4
#define SIGCHIAN_TEST_SIGNAL_NUM_4 4
#define SIGCHIAN_TEST_SIGNAL_NUM_5 5
#define SIGCHIAN_TEST_SIGNAL_NUM_6 6
#define SIGCHIAN_TEST_SIGNAL_NUM_8 8
#define SIGCHIAN_TEST_SIGNAL_NUM_9 9
#define SIGCHIAN_TEST_SIGNAL_NUM_11 11
#define SIGCHIAN_TEST_SIGNAL_NUM_13 13
#define SIGCHIAN_TEST_SIGNAL_NUM_14 14
#define SIGCHAIN_SIGNAL_37 37
#define SIGCHAIN_SIGNAL_37 37
#define SIGCHAIN_SIGNAL_43 43
#define SIGCHAIN_SIGNAL_43 43
#define SIGCHAIN_SIGNAL_45 45
#define SIGCHAIN_SIGNAL_56 56
#define SIGCHAIN_SIGNAL_64 64
#define SIGCHAIN_SIGNAL_64 64
extern
bool
get_sigchain_mask_enable
();
extern
bool
get_sigchain_mask_enable
();
\ No newline at end of file
libc-test/src/functionalext/sigchain/sigchain_add_special_handler.c
浏览文件 @
16f8032c
...
@@ -24,52 +24,52 @@ static int g_count = 0;
...
@@ -24,52 +24,52 @@ static int g_count = 0;
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
abr
t_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
in
t_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
signo
,
SIG
ABR
T
);
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
signo
,
SIG
IN
T
);
return
false
;
return
false
;
}
}
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
abr
t_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
in
t_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
signo
,
SIG
ABR
T
);
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
signo
,
SIG
IN
T
);
return
true
;
return
true
;
}
}
/**
/**
* @tc.name : sigchain_add_special_handler_001
* @tc.name : sigchain_add_special_handler_001
* @tc.desc : The signal
are
not registered with the kernel, call add_special_signal_handler to add
* @tc.desc : The signal
is
not registered with the kernel, call add_special_signal_handler to add
* two special handlers
* two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_add_special_handler_001
()
static
void
sigchain_add_special_handler_001
()
{
{
struct
signal_chain_action
sig
abr
t
=
{
struct
signal_chain_action
sig
in
t
=
{
.
sca_sigaction
=
sigchain_special_sig
abr
t_handler1
,
.
sca_sigaction
=
sigchain_special_sig
in
t_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
ABRT
,
&
sigabr
t
);
add_special_signal_handler
(
SIG
INT
,
&
sigin
t
);
struct
signal_chain_action
sig
abr
t1
=
{
struct
signal_chain_action
sig
in
t1
=
{
.
sca_sigaction
=
sigchain_special_sig
abr
t_handler2
,
.
sca_sigaction
=
sigchain_special_sig
in
t_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
SIGCHAIN_ALLOW_NORETURN
,
.
sca_flags
=
SIGCHAIN_ALLOW_NORETURN
,
};
};
add_special_signal_handler
(
SIG
ABRT
,
&
sigabr
t1
);
add_special_signal_handler
(
SIG
INT
,
&
sigin
t1
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
ABR
T
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
IN
T
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIG
ABR
T
);
raise
(
SIG
IN
T
);
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
EXPECT_EQ
(
"sigchain_add_special_handler_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
}
}
...
@@ -104,12 +104,13 @@ static void signal_sighup_handler(int signo)
...
@@ -104,12 +104,13 @@ static void signal_sighup_handler(int signo)
/**
/**
* @tc.name : sigchain_add_special_handler_002
* @tc.name : sigchain_add_special_handler_002
* @tc.desc : The signal
are
registered with the kernel(Using signal), call
* @tc.desc : The signal
is
registered with the kernel(Using signal), call
* add_special_signal_handler to add two special handlers
* add_special_signal_handler to add two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_add_special_handler_002
()
static
void
sigchain_add_special_handler_002
()
{
{
g_count
=
0
;
signal
(
SIGHUP
,
signal_sighup_handler
);
signal
(
SIGHUP
,
signal_sighup_handler
);
struct
signal_chain_action
sighup
=
{
struct
signal_chain_action
sighup
=
{
...
@@ -132,72 +133,73 @@ static void sigchain_add_special_handler_002()
...
@@ -132,72 +133,73 @@ static void sigchain_add_special_handler_002()
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIGHUP
);
raise
(
SIGHUP
);
EXPECT_EQ
(
"sigchain_add_special_handler_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
5
);
EXPECT_EQ
(
"sigchain_add_special_handler_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
3
);
}
}
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
segv
_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
usr2
_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
USR2
);
return
false
;
return
false
;
}
}
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
segv
_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
usr2
_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
USR2
);
return
false
;
return
false
;
}
}
/**
/**
* @brief the signal handler
* @brief the signal handler
*/
*/
static
void
signal_sig
segv
_sigaction
(
int
signo
)
static
void
signal_sig
usr2
_sigaction
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
signo
,
SIG
USR2
);
}
}
/**
/**
* @tc.name : sigchain_add_special_handler_003
* @tc.name : sigchain_add_special_handler_003
* @tc.desc :
the signal that are
registered with the kernel(Using sigaction), call
* @tc.desc :
The signal is
registered with the kernel(Using sigaction), call
* add_special_signal_handler to add two special handlers
* add_special_signal_handler to add two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_add_special_handler_003
()
static
void
sigchain_add_special_handler_003
()
{
{
g_count
=
0
;
struct
sigaction
sigac
=
{
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_sig
segv
_sigaction
,
.
sa_handler
=
signal_sig
usr2
_sigaction
,
};
};
sigaction
(
SIG
SEGV
,
&
sigac
,
NULL
);
sigaction
(
SIG
USR2
,
&
sigac
,
NULL
);
struct
signal_chain_action
sig
segv
=
{
struct
signal_chain_action
sig
usr2
=
{
.
sca_sigaction
=
sigchain_special_sig
segv
_handler1
,
.
sca_sigaction
=
sigchain_special_sig
usr2
_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
struct
signal_chain_action
sig
segv2
=
{
struct
signal_chain_action
sig
usr21
=
{
.
sca_sigaction
=
sigchain_special_sig
segv
_handler2
,
.
sca_sigaction
=
sigchain_special_sig
usr2
_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv2
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr21
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SEGV
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
8
);
EXPECT_EQ
(
"sigchain_add_special_handler_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
3
);
}
}
/**
/**
...
@@ -218,6 +220,7 @@ static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void
...
@@ -218,6 +220,7 @@ static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void
*/
*/
static
void
sigchain_add_special_handler_004
()
static
void
sigchain_add_special_handler_004
()
{
{
g_count
=
0
;
struct
signal_chain_action
sigterm
=
{
struct
signal_chain_action
sigterm
=
{
.
sca_sigaction
=
sigchain_special_sigterm_handler
,
.
sca_sigaction
=
sigchain_special_sigterm_handler
,
.
sca_mask
=
{},
.
sca_mask
=
{},
...
@@ -232,7 +235,7 @@ static void sigchain_add_special_handler_004()
...
@@ -232,7 +235,7 @@ static void sigchain_add_special_handler_004()
}
}
raise
(
SIGTERM
);
raise
(
SIGTERM
);
EXPECT_EQ
(
"sigchain_add_special_handler_004"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
9
);
EXPECT_EQ
(
"sigchain_add_special_handler_004"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
}
}
/**
/**
...
@@ -262,6 +265,7 @@ static void signal_64_handler(int signo)
...
@@ -262,6 +265,7 @@ static void signal_64_handler(int signo)
*/
*/
static
void
sigchain_add_special_handler_005
()
static
void
sigchain_add_special_handler_005
()
{
{
g_count
=
0
;
signal
(
SIGCHAIN_SIGNAL_64
,
signal_64_handler
);
signal
(
SIGCHAIN_SIGNAL_64
,
signal_64_handler
);
struct
signal_chain_action
sighup
=
{
struct
signal_chain_action
sighup
=
{
...
@@ -277,7 +281,7 @@ static void sigchain_add_special_handler_005()
...
@@ -277,7 +281,7 @@ static void sigchain_add_special_handler_005()
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_005"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_005"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIGCHAIN_SIGNAL_64
);
raise
(
SIGCHAIN_SIGNAL_64
);
EXPECT_EQ
(
"sigchain_add_special_handler_005"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
11
);
EXPECT_EQ
(
"sigchain_add_special_handler_005"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
}
}
/**
/**
...
@@ -307,6 +311,7 @@ static void signal_37_sigaction(int signo)
...
@@ -307,6 +311,7 @@ static void signal_37_sigaction(int signo)
*/
*/
static
void
sigchain_add_special_handler_006
()
static
void
sigchain_add_special_handler_006
()
{
{
g_count
=
0
;
struct
sigaction
sigac
=
{
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_37_sigaction
,
.
sa_handler
=
signal_37_sigaction
,
};
};
...
@@ -326,7 +331,7 @@ static void sigchain_add_special_handler_006()
...
@@ -326,7 +331,7 @@ static void sigchain_add_special_handler_006()
}
}
raise
(
SIGCHAIN_SIGNAL_37
);
raise
(
SIGCHAIN_SIGNAL_37
);
EXPECT_EQ
(
"sigchain_add_special_handler_006"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
13
);
EXPECT_EQ
(
"sigchain_add_special_handler_006"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
}
}
/**
/**
...
@@ -345,7 +350,7 @@ static bool sigchain_special_43_handler(int signo, siginfo_t *siginfo, void *uco
...
@@ -345,7 +350,7 @@ static bool sigchain_special_43_handler(int signo, siginfo_t *siginfo, void *uco
static
void
signal_43_sigaction
(
int
signo
)
static
void
signal_43_sigaction
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_FALSE
(
"sigchain_
intercept_sigprocmask_003
"
,
true
);
EXPECT_FALSE
(
"sigchain_
add_special_handler_007
"
,
true
);
}
}
/**
/**
...
@@ -356,6 +361,7 @@ static void signal_43_sigaction(int signo)
...
@@ -356,6 +361,7 @@ static void signal_43_sigaction(int signo)
*/
*/
static
void
sigchain_add_special_handler_007
()
static
void
sigchain_add_special_handler_007
()
{
{
g_count
=
0
;
struct
sigaction
sigac
=
{
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_43_sigaction
,
.
sa_handler
=
signal_43_sigaction
,
};
};
...
@@ -375,7 +381,126 @@ static void sigchain_add_special_handler_007()
...
@@ -375,7 +381,126 @@ static void sigchain_add_special_handler_007()
}
}
raise
(
SIGCHAIN_SIGNAL_43
);
raise
(
SIGCHAIN_SIGNAL_43
);
EXPECT_EQ
(
"sigchain_add_special_handler_007"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_14
);
EXPECT_EQ
(
"sigchain_add_special_handler_007"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
/**
* @brief the special handler
*/
static
bool
sigchain_special_45_handler
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_008"
,
signo
,
SIGCHAIN_SIGNAL_45
);
return
false
;
}
/**
* @brief the signal handler
*/
static
void
signal_45_sigaction
(
int
signo
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_008"
,
signo
,
SIGCHAIN_SIGNAL_45
);
}
/**
* @tc.name : sigchain_add_special_handler_008
* @tc.desc : There is no special handler, add the special at the last of the chains
* @tc.level : Level 0
*/
static
void
sigchain_add_special_handler_008
()
{
g_count
=
0
;
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_45_sigaction
,
};
sigaction
(
SIGCHAIN_SIGNAL_45
,
&
sigac
,
NULL
);
struct
signal_chain_action
sig45
=
{
.
sca_sigaction
=
sigchain_special_45_handler
,
.
sca_mask
=
{},
.
sca_flags
=
0
,
};
add_special_handler_at_last
(
SIGCHAIN_SIGNAL_45
,
&
sig45
);
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGCHAIN_SIGNAL_45
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_008"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
raise
(
SIGCHAIN_SIGNAL_45
);
EXPECT_EQ
(
"sigchain_add_special_handler_008"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
}
/**
* @brief the special handler
*/
static
bool
sigchain_special_56_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
signo
,
SIGCHAIN_SIGNAL_56
);
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
return
false
;
}
/**
* @brief the special handler
*/
static
bool
sigchain_special_56_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
signo
,
SIGCHAIN_SIGNAL_56
);
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
return
false
;
}
/**
* @brief the signal handler
*/
static
void
signal_56_sigaction
(
int
signo
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
signo
,
SIGCHAIN_SIGNAL_56
);
}
/**
* @tc.name : sigchain_add_special_handler_009
* @tc.desc : There are one special handler, add the special at the last of the chains
* @tc.level : Level 0
*/
static
void
sigchain_add_special_handler_009
()
{
g_count
=
0
;
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_56_sigaction
,
};
sigaction
(
SIGCHAIN_SIGNAL_56
,
&
sigac
,
NULL
);
struct
signal_chain_action
sig56
=
{
.
sca_sigaction
=
sigchain_special_56_handler2
,
.
sca_mask
=
{},
.
sca_flags
=
0
,
};
add_special_signal_handler
(
SIGCHAIN_SIGNAL_56
,
&
sig56
);
struct
signal_chain_action
sig561
=
{
.
sca_sigaction
=
sigchain_special_56_handler1
,
.
sca_mask
=
{},
.
sca_flags
=
0
,
};
add_special_handler_at_last
(
SIGCHAIN_SIGNAL_56
,
&
sig561
);
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGCHAIN_SIGNAL_56
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_add_special_handler_009"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
raise
(
SIGCHAIN_SIGNAL_56
);
EXPECT_EQ
(
"sigchain_add_special_handler_009"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_3
);
}
}
int
main
(
void
)
int
main
(
void
)
...
@@ -387,5 +512,7 @@ int main(void)
...
@@ -387,5 +512,7 @@ int main(void)
sigchain_add_special_handler_005
();
sigchain_add_special_handler_005
();
sigchain_add_special_handler_006
();
sigchain_add_special_handler_006
();
sigchain_add_special_handler_007
();
sigchain_add_special_handler_007
();
sigchain_add_special_handler_008
();
sigchain_add_special_handler_009
();
return
t_status
;
return
t_status
;
}
}
\ No newline at end of file
libc-test/src/functionalext/sigchain/sigchain_handler_call_order.c
浏览文件 @
16f8032c
...
@@ -29,9 +29,9 @@ static bool sigchain_special_handler(int signo, siginfo_t *siginfo, void *uconte
...
@@ -29,9 +29,9 @@ static bool sigchain_special_handler(int signo, siginfo_t *siginfo, void *uconte
{
{
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
signo
,
SIGHUP
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
signo
,
SIGHUP
);
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signal
[
SIGCHIAN_TEST_SIGNAL_NUM_2
]
=
{
SIGHUP
,
SIG
SEGV
};
int
signal
[
SIGCHIAN_TEST_SIGNAL_NUM_2
]
=
{
SIGHUP
,
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_
intercept_sigprocmask
_001"
,
signal
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_
handler_call_order
_001"
,
signal
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
g_count
++
;
g_count
++
;
return
false
;
return
false
;
}
}
...
@@ -41,7 +41,7 @@ static bool sigchain_special_handler(int signo, siginfo_t *siginfo, void *uconte
...
@@ -41,7 +41,7 @@ static bool sigchain_special_handler(int signo, siginfo_t *siginfo, void *uconte
*/
*/
static
bool
sigchain_special_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
signo
,
SIG
USR2
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
g_count
++
;
g_count
++
;
return
false
;
return
false
;
...
@@ -58,13 +58,13 @@ static void signal_handler(int signo)
...
@@ -58,13 +58,13 @@ static void signal_handler(int signo)
/**
/**
* @tc.name : sigchain_handler_call_order_001
* @tc.name : sigchain_handler_call_order_001
* @tc.desc : The signals are registered with the special handler, and mask and rasie the signal
* @tc.desc : The signals are registered with the special handler, and mask and rasie the signal
* at the special handler. Test the influence of sigchain on
sigproc
mask.
* at the special handler. Test the influence of sigchain on
pthread_sig
mask.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_handler_call_order_001
()
static
void
sigchain_handler_call_order_001
()
{
{
signal
(
SIGHUP
,
signal_handler
);
signal
(
SIGHUP
,
signal_handler
);
signal
(
SIG
SEGV
,
signal_handler
);
signal
(
SIG
USR2
,
signal_handler
);
struct
signal_chain_action
sighup
=
{
struct
signal_chain_action
sighup
=
{
.
sca_sigaction
=
sigchain_special_handler
,
.
sca_sigaction
=
sigchain_special_handler
,
...
@@ -73,12 +73,12 @@ static void sigchain_handler_call_order_001()
...
@@ -73,12 +73,12 @@ static void sigchain_handler_call_order_001()
};
};
add_special_signal_handler
(
SIGHUP
,
&
sighup
);
add_special_signal_handler
(
SIGHUP
,
&
sighup
);
struct
signal_chain_action
sig
segv
=
{
struct
signal_chain_action
sig
usr2
=
{
.
sca_sigaction
=
sigchain_special_handler1
,
.
sca_sigaction
=
sigchain_special_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
raise
(
SIGHUP
);
raise
(
SIGHUP
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_4
);
EXPECT_EQ
(
"sigchain_handler_call_order_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_4
);
...
@@ -89,7 +89,7 @@ static void sigchain_handler_call_order_001()
...
@@ -89,7 +89,7 @@ static void sigchain_handler_call_order_001()
*/
*/
static
bool
sigchain_special_handler3
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler3
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
signo
,
SIG
SYS
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
signo
,
SIG
PWR
);
g_count
++
;
g_count
++
;
return
false
;
return
false
;
}
}
...
@@ -99,8 +99,8 @@ static bool sigchain_special_handler3(int signo, siginfo_t *siginfo, void *ucont
...
@@ -99,8 +99,8 @@ static bool sigchain_special_handler3(int signo, siginfo_t *siginfo, void *ucont
*/
*/
static
void
signal_handler3
(
int
signo
)
static
void
signal_handler3
(
int
signo
)
{
{
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
signo
,
SIG
SYS
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
signo
,
SIG
PWR
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
5
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
g_count
++
;
g_count
++
;
return
;
return
;
}
}
...
@@ -113,17 +113,18 @@ static void signal_handler3(int signo)
...
@@ -113,17 +113,18 @@ static void signal_handler3(int signo)
*/
*/
static
void
sigchain_handler_call_order_002
()
static
void
sigchain_handler_call_order_002
()
{
{
signal
(
SIGSYS
,
signal_handler3
);
g_count
=
0
;
signal
(
SIGPWR
,
signal_handler3
);
struct
signal_chain_action
sigsegv
=
{
struct
signal_chain_action
sigsegv
=
{
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SYS
,
&
sigsegv
);
add_special_signal_handler
(
SIG
PWR
,
&
sigsegv
);
raise
(
SIG
SYS
);
raise
(
SIG
PWR
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
6
);
EXPECT_EQ
(
"sigchain_handler_call_order_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
}
}
int
main
(
void
)
int
main
(
void
)
...
...
libc-test/src/functionalext/sigchain/sigchain_intercept_
sigproc
mask.c
→
libc-test/src/functionalext/sigchain/sigchain_intercept_
pthread_sig
mask.c
浏览文件 @
16f8032c
...
@@ -29,7 +29,7 @@ static int g_count = 0;
...
@@ -29,7 +29,7 @@ static int g_count = 0;
static
bool
sigchain_special_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_
sigprocmask_001"
,
signo
,
SIGSEGV
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sigmask_001"
,
signo
,
SIGUSR2
);
return
false
;
return
false
;
}
}
...
@@ -39,37 +39,37 @@ static bool sigchain_special_handler2(int signo, siginfo_t *siginfo, void *ucont
...
@@ -39,37 +39,37 @@ static bool sigchain_special_handler2(int signo, siginfo_t *siginfo, void *ucont
static
void
signal_handler2
(
int
signo
)
static
void
signal_handler2
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_
sigprocmask_001"
,
signo
,
SIGSEGV
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sigmask_001"
,
signo
,
SIGUSR2
);
}
}
/**
/**
* @tc.name : sigchain_intercept_
sigproc
mask_001
* @tc.name : sigchain_intercept_
pthread_sig
mask_001
* @tc.desc : The signal
s are
registered with the special handler, test the influence of sigchain
* @tc.desc : The signal
is
registered with the special handler, test the influence of sigchain
* on
sigproc
mask.
* on
pthread_sig
mask.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_
sigproc
mask_001
()
static
void
sigchain_intercept_
pthread_sig
mask_001
()
{
{
struct
sigaction
siga2
=
{
struct
sigaction
siga2
=
{
.
sa_handler
=
signal_handler2
,
.
sa_handler
=
signal_handler2
,
};
};
sigaction
(
SIG
SEGV
,
&
siga2
,
NULL
);
sigaction
(
SIG
USR2
,
&
siga2
,
NULL
);
struct
signal_chain_action
sig
segv
=
{
struct
signal_chain_action
sig
usr2
=
{
.
sca_sigaction
=
sigchain_special_handler2
,
.
sca_sigaction
=
sigchain_special_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SEGV
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
sigproc
mask_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
pthread_sig
mask_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
EXPECT_EQ
(
"sigchain_intercept_
sigproc
mask_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sig
mask_001"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
}
else
{
}
else
{
EXPECT_EQ
(
"sigchain_intercept_
sigproc
mask_001"
,
g_count
,
0
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sig
mask_001"
,
g_count
,
0
);
}
}
}
}
...
@@ -79,7 +79,7 @@ static void sigchain_intercept_sigprocmask_001()
...
@@ -79,7 +79,7 @@ static void sigchain_intercept_sigprocmask_001()
static
bool
sigchain_special_handler3
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler3
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_FALSE
(
"sigchain_intercept_
sigproc
mask_002"
,
true
);
EXPECT_FALSE
(
"sigchain_intercept_
pthread_sig
mask_002"
,
true
);
return
false
;
return
false
;
}
}
...
@@ -89,61 +89,62 @@ static bool sigchain_special_handler3(int signo, siginfo_t *siginfo, void *ucont
...
@@ -89,61 +89,62 @@ static bool sigchain_special_handler3(int signo, siginfo_t *siginfo, void *ucont
static
void
signal_handler3
(
int
signo
)
static
void
signal_handler3
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_
sigprocmask_002"
,
signo
,
SIGSYS
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sigmask_002"
,
signo
,
SIGPWR
);
}
}
/**
/**
* @tc.name : sigchain_intercept_
sigproc
mask_002
* @tc.name : sigchain_intercept_
pthread_sig
mask_002
* @tc.desc : The signals are registered with the special handler, and remove the special handler.
* @tc.desc : The signals are registered with the special handler, and remove the special handler.
* Test the influence of sigchain on
sigproc
mask.
* Test the influence of sigchain on
pthread_sig
mask.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_
sigproc
mask_002
()
static
void
sigchain_intercept_
pthread_sig
mask_002
()
{
{
g_count
=
0
;
struct
sigaction
siga2
=
{
struct
sigaction
siga2
=
{
.
sa_handler
=
signal_handler3
,
.
sa_handler
=
signal_handler3
,
};
};
sigaction
(
SIG
SYS
,
&
siga2
,
NULL
);
sigaction
(
SIG
PWR
,
&
siga2
,
NULL
);
struct
signal_chain_action
sigsegv
=
{
struct
signal_chain_action
sigsegv
=
{
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SYS
,
&
sigsegv
);
add_special_signal_handler
(
SIG
PWR
,
&
sigsegv
);
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SYS
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
PWR
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
sigproc
mask_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
pthread_sig
mask_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
remove_special_signal_handler
(
SIG
SYS
,
sigchain_special_handler3
);
remove_special_signal_handler
(
SIG
PWR
,
sigchain_special_handler3
);
raise
(
SIG
SYS
);
raise
(
SIG
PWR
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
EXPECT_EQ
(
"sigchain_intercept_
sigprocmask_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_3
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sigmask_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
else
{
}
else
{
EXPECT_EQ
(
"sigchain_intercept_
sigproc
mask_002"
,
g_count
,
0
);
EXPECT_EQ
(
"sigchain_intercept_
pthread_sig
mask_002"
,
g_count
,
0
);
}
}
}
}
/**
/**
* @brief the signal handler
* @brief the signal handler
*/
*/
static
void
signal_handler1
(
int
signo
)
static
void
signal_handler1
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_FALSE
(
"sigchain_intercept_
sigproc
mask_001"
,
true
);
EXPECT_FALSE
(
"sigchain_intercept_
pthread_sig
mask_001"
,
true
);
}
}
/**
/**
* @tc.name : sigchain_intercept_
sigproc
mask_003
* @tc.name : sigchain_intercept_
pthread_sig
mask_003
* @tc.desc : The signals are not registered with the special handler, test the influence of sigchain
* @tc.desc : The signals are not registered with the special handler, test the influence of sigchain
* on
sigproc
mask.
* on
pthread_sig
mask.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_
sigproc
mask_003
()
static
void
sigchain_intercept_
pthread_sig
mask_003
()
{
{
g_count
=
0
;
struct
sigaction
siga1
=
{
struct
sigaction
siga1
=
{
.
sa_handler
=
signal_handler1
,
.
sa_handler
=
signal_handler1
,
};
};
...
@@ -151,32 +152,29 @@ static void sigchain_intercept_sigprocmask_003()
...
@@ -151,32 +152,29 @@ static void sigchain_intercept_sigprocmask_003()
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGHUP
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGHUP
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
sigproc
mask_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_
pthread_sig
mask_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
raise
(
SIGHUP
);
raise
(
SIGHUP
);
if
(
get_sigchain_mask_enable
())
{
EXPECT_EQ
(
"sigchain_intercept_pthread_sigmask_003"
,
g_count
,
0
);
EXPECT_EQ
(
"sigchain_intercept_sigprocmask_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_3
);
}
else
{
EXPECT_EQ
(
"sigchain_intercept_sigprocmask_003"
,
g_count
,
0
);
}
}
}
/**
/**
* @tc.name : sigchain_intercept_
sigproc
mask_004
* @tc.name : sigchain_intercept_
pthread_sig
mask_004
* @tc.desc : The new set is null, call
sigproc
mask.
* @tc.desc : The new set is null, call
pthread_sig
mask.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_
sigproc
mask_004
()
static
void
sigchain_intercept_
pthread_sig
mask_004
()
{
{
int
result
=
sigproc
mask
(
SIG_BLOCK
,
NULL
,
NULL
);
int
result
=
pthread_sig
mask
(
SIG_BLOCK
,
NULL
,
NULL
);
if
(
result
!=
0
)
{
if
(
result
!=
0
)
{
EXPECT_FALSE
(
"sigchain_intercept_
sigproc
mask_004"
,
true
);
EXPECT_FALSE
(
"sigchain_intercept_
pthread_sig
mask_004"
,
true
);
}
}
}
}
int
main
(
void
)
int
main
(
void
)
{
{
sigchain_intercept_
sigproc
mask_001
();
sigchain_intercept_
pthread_sig
mask_001
();
sigchain_intercept_
sigproc
mask_002
();
sigchain_intercept_
pthread_sig
mask_002
();
sigchain_intercept_
sigproc
mask_003
();
sigchain_intercept_
pthread_sig
mask_003
();
sigchain_intercept_
sigproc
mask_004
();
sigchain_intercept_
pthread_sig
mask_004
();
return
t_status
;
return
t_status
;
}
}
\ No newline at end of file
libc-test/src/functionalext/sigchain/sigchain_intercept_sigaction.c
浏览文件 @
16f8032c
...
@@ -33,7 +33,7 @@ static void signal_handler1(int signo)
...
@@ -33,7 +33,7 @@ static void signal_handler1(int signo)
/**
/**
* @tc.name : sigchain_intercept_sigaction_001
* @tc.name : sigchain_intercept_sigaction_001
* @tc.desc : The signal
s are
not registered with the special handler, test the influence of sigchain
* @tc.desc : The signal
is
not registered with the special handler, test the influence of sigchain
* on sigaction.
* on sigaction.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
...
@@ -41,6 +41,7 @@ static void sigchain_intercept_sigaction_001()
...
@@ -41,6 +41,7 @@ static void sigchain_intercept_sigaction_001()
{
{
struct
sigaction
siga1
=
{
struct
sigaction
siga1
=
{
.
sa_handler
=
signal_handler1
,
.
sa_handler
=
signal_handler1
,
.
sa_flags
=
SA_RESTART
,
};
};
sigaction
(
SIGHUP
,
&
siga1
,
NULL
);
sigaction
(
SIGHUP
,
&
siga1
,
NULL
);
...
@@ -54,7 +55,7 @@ static void sigchain_intercept_sigaction_001()
...
@@ -54,7 +55,7 @@ static void sigchain_intercept_sigaction_001()
static
bool
sigchain_special_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
signo
,
SIG
USR2
);
return
false
;
return
false
;
}
}
...
@@ -64,37 +65,39 @@ static bool sigchain_special_handler2(int signo, siginfo_t *siginfo, void *ucont
...
@@ -64,37 +65,39 @@ static bool sigchain_special_handler2(int signo, siginfo_t *siginfo, void *ucont
static
void
signal_handler2
(
int
signo
)
static
void
signal_handler2
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
signo
,
SIG
USR2
);
}
}
/**
/**
* @tc.name : sigchain_intercept_sigaction_002
* @tc.name : sigchain_intercept_sigaction_002
* @tc.desc : The signals
are
registered with the special handler, test the influence of sigchain on sigaction.
* @tc.desc : The signals
is
registered with the special handler, test the influence of sigchain on sigaction.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_sigaction_002
()
static
void
sigchain_intercept_sigaction_002
()
{
{
struct
signal_chain_action
sigsegv
=
{
g_count
=
0
;
struct
signal_chain_action
sigusr2
=
{
.
sca_sigaction
=
sigchain_special_handler2
,
.
sca_sigaction
=
sigchain_special_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
struct
sigaction
siga2
=
{
struct
sigaction
siga2
=
{
.
sa_handler
=
signal_handler2
,
.
sa_handler
=
signal_handler2
,
.
sa_flags
=
SA_RESTART
,
};
};
sigaction
(
SIG
SEGV
,
&
siga2
,
NULL
);
sigaction
(
SIG
USR2
,
&
siga2
,
NULL
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SEGV
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_sigaction_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_sigaction_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
3
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
}
}
/**
/**
...
@@ -118,12 +121,13 @@ static void signal_handler3(int signo)
...
@@ -118,12 +121,13 @@ static void signal_handler3(int signo)
/**
/**
* @tc.name : sigchain_intercept_sigaction_003
* @tc.name : sigchain_intercept_sigaction_003
* @tc.desc : the signal
s are
registered with the special handler, and remove the special handler. Test
* @tc.desc : the signal
is
registered with the special handler, and remove the special handler. Test
* the influence of sigchain on sigaction.
* the influence of sigchain on sigaction.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_sigaction_003
()
static
void
sigchain_intercept_sigaction_003
()
{
{
g_count
=
0
;
struct
signal_chain_action
sigurg
=
{
struct
signal_chain_action
sigurg
=
{
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_mask
=
{},
.
sca_mask
=
{},
...
@@ -133,19 +137,21 @@ static void sigchain_intercept_sigaction_003()
...
@@ -133,19 +137,21 @@ static void sigchain_intercept_sigaction_003()
struct
sigaction
siga2
=
{
struct
sigaction
siga2
=
{
.
sa_handler
=
signal_handler3
,
.
sa_handler
=
signal_handler3
,
.
sa_flags
=
SA_RESTART
,
};
};
sigaction
(
SIGURG
,
&
siga2
,
NULL
);
sigaction
(
SIGURG
,
&
siga2
,
NULL
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGURG
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGURG
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_sigaction_00
2
"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_sigaction_00
3
"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
remove_special_signal_handler
(
SIGURG
,
sigchain_special_handler3
);
remove_special_signal_handler
(
SIGURG
,
sigchain_special_handler3
);
raise
(
SIGURG
);
raise
(
SIGURG
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
4
);
EXPECT_EQ
(
"sigchain_intercept_sigaction_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
}
}
int
main
(
void
)
int
main
(
void
)
{
{
sigchain_intercept_sigaction_001
();
sigchain_intercept_sigaction_001
();
...
...
libc-test/src/functionalext/sigchain/sigchain_intercept_signal.c
浏览文件 @
16f8032c
...
@@ -33,7 +33,7 @@ static void signal_handler1(int signo)
...
@@ -33,7 +33,7 @@ static void signal_handler1(int signo)
/**
/**
* @tc.name : sigchain_add_special_handler_025
* @tc.name : sigchain_add_special_handler_025
* @tc.desc : The signal
s are
not registered with the special handler, test the influence of sigchain on signal
* @tc.desc : The signal
is
not registered with the special handler, test the influence of sigchain on signal
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_signal_001
()
static
void
sigchain_intercept_signal_001
()
...
@@ -49,7 +49,7 @@ static void sigchain_intercept_signal_001()
...
@@ -49,7 +49,7 @@ static void sigchain_intercept_signal_001()
static
bool
sigchain_special_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
signo
,
SIG
USR2
);
return
false
;
return
false
;
}
}
...
@@ -59,32 +59,33 @@ static bool sigchain_special_handler1(int signo, siginfo_t *siginfo, void *ucont
...
@@ -59,32 +59,33 @@ static bool sigchain_special_handler1(int signo, siginfo_t *siginfo, void *ucont
static
void
signal_handler2
(
int
signo
)
static
void
signal_handler2
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
signo
,
SIG
USR2
);
}
}
/**
/**
* @tc.name : sigchain_intercept_signal_002
* @tc.name : sigchain_intercept_signal_002
* @tc.desc : The signal
s are
registered with the special handler, test the influence of sigchain on signal
* @tc.desc : The signal
is
registered with the special handler, test the influence of sigchain on signal
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_signal_002
()
static
void
sigchain_intercept_signal_002
()
{
{
struct
signal_chain_action
sigsegv
=
{
g_count
=
0
;
struct
signal_chain_action
sigusr2
=
{
.
sca_sigaction
=
sigchain_special_handler1
,
.
sca_sigaction
=
sigchain_special_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
signal
(
SIG
SEGV
,
signal_handler2
);
signal
(
SIG
USR2
,
signal_handler2
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SEGV
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_signal_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_signal_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
3
);
EXPECT_EQ
(
"sigchain_intercept_signal_002"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
}
}
/**
/**
...
@@ -109,12 +110,13 @@ static void signal_handler3(int signo)
...
@@ -109,12 +110,13 @@ static void signal_handler3(int signo)
/**
/**
* @tc.name : sigchain_intercept_signal_003
* @tc.name : sigchain_intercept_signal_003
* @tc.desc : The signal
s are
registered with the special handler, and remove the special handler.
* @tc.desc : The signal
is
registered with the special handler, and remove the special handler.
* Test the influence of sigchain on signal
* Test the influence of sigchain on signal
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_intercept_signal_003
()
static
void
sigchain_intercept_signal_003
()
{
{
g_count
=
0
;
struct
signal_chain_action
sigurg
=
{
struct
signal_chain_action
sigurg
=
{
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_sigaction
=
sigchain_special_handler3
,
.
sca_mask
=
{},
.
sca_mask
=
{},
...
@@ -126,13 +128,8 @@ static void sigchain_intercept_signal_003()
...
@@ -126,13 +128,8 @@ static void sigchain_intercept_signal_003()
remove_special_signal_handler
(
SIGURG
,
sigchain_special_handler3
);
remove_special_signal_handler
(
SIGURG
,
sigchain_special_handler3
);
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGURG
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_intercept_sigaction_002"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
raise
(
SIGURG
);
raise
(
SIGURG
);
EXPECT_EQ
(
"sigchain_intercept_signal_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
4
);
EXPECT_EQ
(
"sigchain_intercept_signal_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
}
}
int
main
(
void
)
int
main
(
void
)
{
{
...
...
libc-test/src/functionalext/sigchain/sigchain_rm_special_handler.c
浏览文件 @
16f8032c
...
@@ -43,35 +43,35 @@ static bool sigchain_special_sigabrt_handler2(int signo, siginfo_t *siginfo, voi
...
@@ -43,35 +43,35 @@ static bool sigchain_special_sigabrt_handler2(int signo, siginfo_t *siginfo, voi
/**
/**
* @tc.name : sigchain_rm_special_handler_001
* @tc.name : sigchain_rm_special_handler_001
* @tc.desc : The signal
are
not registered with the kernel, call remove_special_signal_handler to remove
* @tc.desc : The signal
is
not registered with the kernel, call remove_special_signal_handler to remove
* two special handlers
* two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_001
()
static
void
sigchain_rm_special_handler_001
()
{
{
struct
signal_chain_action
sig
abr
t
=
{
struct
signal_chain_action
sig
con
t
=
{
.
sca_sigaction
=
sigchain_special_sigabrt_handler1
,
.
sca_sigaction
=
sigchain_special_sigabrt_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
ABRT
,
&
sigabr
t
);
add_special_signal_handler
(
SIG
CONT
,
&
sigcon
t
);
struct
signal_chain_action
sig
abr
t1
=
{
struct
signal_chain_action
sig
con
t1
=
{
.
sca_sigaction
=
sigchain_special_sigabrt_handler2
,
.
sca_sigaction
=
sigchain_special_sigabrt_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
SIGCHAIN_ALLOW_NORETURN
,
.
sca_flags
=
SIGCHAIN_ALLOW_NORETURN
,
};
};
add_special_signal_handler
(
SIG
ABRT
,
&
sigabr
t1
);
add_special_signal_handler
(
SIG
CONT
,
&
sigcon
t1
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
ABR
T
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
CON
T
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_001"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
remove_special_signal_handler
(
SIG
ABR
T
,
sigchain_special_sigabrt_handler1
);
remove_special_signal_handler
(
SIG
CON
T
,
sigchain_special_sigabrt_handler1
);
remove_special_signal_handler
(
SIG
ABR
T
,
sigchain_special_sigabrt_handler2
);
remove_special_signal_handler
(
SIG
CON
T
,
sigchain_special_sigabrt_handler2
);
raise
(
SIG
ABR
T
);
raise
(
SIG
CON
T
);
EXPECT_EQ
(
"sigchain_rm_special_handler_001"
,
g_count
,
0
);
EXPECT_EQ
(
"sigchain_rm_special_handler_001"
,
g_count
,
0
);
}
}
...
@@ -106,12 +106,13 @@ static void signal_sighup_handler(int signo)
...
@@ -106,12 +106,13 @@ static void signal_sighup_handler(int signo)
/**
/**
* @tc.name : sigchain_rm_special_handler_002
* @tc.name : sigchain_rm_special_handler_002
* @tc.desc : The signal
are
registered with the kernel(Using signal), call
* @tc.desc : The signal
is
registered with the kernel(Using signal), call
* remove_special_signal_handler to remove two special handlers
* remove_special_signal_handler to remove two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_002
()
static
void
sigchain_rm_special_handler_002
()
{
{
g_count
=
0
;
signal
(
SIGHUP
,
signal_sighup_handler
);
signal
(
SIGHUP
,
signal_sighup_handler
);
struct
signal_chain_action
sighup
=
{
struct
signal_chain_action
sighup
=
{
...
@@ -143,7 +144,7 @@ static void sigchain_rm_special_handler_002()
...
@@ -143,7 +144,7 @@ static void sigchain_rm_special_handler_002()
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
segv
_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
usr2
_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_FALSE
(
"sigchain_rm_special_handler_003"
,
true
);
EXPECT_FALSE
(
"sigchain_rm_special_handler_003"
,
true
);
...
@@ -153,7 +154,7 @@ static bool sigchain_special_sigsegv_handler1(int signo, siginfo_t *siginfo, voi
...
@@ -153,7 +154,7 @@ static bool sigchain_special_sigsegv_handler1(int signo, siginfo_t *siginfo, voi
/**
/**
* @brief the special handler
* @brief the special handler
*/
*/
static
bool
sigchain_special_sig
segv
_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
static
bool
sigchain_special_sig
usr2
_handler2
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
{
g_count
++
;
g_count
++
;
EXPECT_FALSE
(
"sigchain_rm_special_handler_003"
,
true
);
EXPECT_FALSE
(
"sigchain_rm_special_handler_003"
,
true
);
...
@@ -163,49 +164,50 @@ static bool sigchain_special_sigsegv_handler2(int signo, siginfo_t *siginfo, voi
...
@@ -163,49 +164,50 @@ static bool sigchain_special_sigsegv_handler2(int signo, siginfo_t *siginfo, voi
/**
/**
* @brief the signal handler
* @brief the signal handler
*/
*/
static
void
signal_sig
segv
_sigaction
(
int
signo
)
static
void
signal_sig
usr2
_sigaction
(
int
signo
)
{
{
g_count
++
;
g_count
++
;
EXPECT_EQ
(
"sigchain_rm_special_handler_003"
,
signo
,
SIG
SEGV
);
EXPECT_EQ
(
"sigchain_rm_special_handler_003"
,
signo
,
SIG
USR2
);
}
}
/**
/**
* @tc.name : sigchain_rm_special_handler_003
* @tc.name : sigchain_rm_special_handler_003
* @tc.desc :
the signal that are
registered with the kernel(Using sigaction), call
* @tc.desc :
The signal is
registered with the kernel(Using sigaction), call
* remove_special_signal_handler to remove two special handlers
* remove_special_signal_handler to remove two special handlers
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_003
()
static
void
sigchain_rm_special_handler_003
()
{
{
g_count
=
0
;
struct
sigaction
sigac
=
{
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_sig
segv
_sigaction
,
.
sa_handler
=
signal_sig
usr2
_sigaction
,
};
};
sigaction
(
SIG
SEGV
,
&
sigac
,
NULL
);
sigaction
(
SIG
USR2
,
&
sigac
,
NULL
);
struct
signal_chain_action
sig
segv
=
{
struct
signal_chain_action
sig
usr2
=
{
.
sca_sigaction
=
sigchain_special_sig
segv
_handler1
,
.
sca_sigaction
=
sigchain_special_sig
usr2
_handler1
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr2
);
struct
signal_chain_action
sig
segv2
=
{
struct
signal_chain_action
sig
usr21
=
{
.
sca_sigaction
=
sigchain_special_sig
segv
_handler2
,
.
sca_sigaction
=
sigchain_special_sig
usr2
_handler2
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
SEGV
,
&
sigsegv2
);
add_special_signal_handler
(
SIG
USR2
,
&
sigusr21
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
SEGV
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
USR2
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_003"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
remove_special_signal_handler
(
SIG
SEGV
,
sigchain_special_sigsegv
_handler1
);
remove_special_signal_handler
(
SIG
USR2
,
sigchain_special_sigusr2
_handler1
);
remove_special_signal_handler
(
SIG
SEGV
,
sigchain_special_sigsegv
_handler2
);
remove_special_signal_handler
(
SIG
USR2
,
sigchain_special_sigusr2
_handler2
);
raise
(
SIG
SEGV
);
raise
(
SIG
USR2
);
EXPECT_EQ
(
"sigchain_rm_special_handler_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
2
);
EXPECT_EQ
(
"sigchain_rm_special_handler_003"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
}
}
/**
/**
...
@@ -220,29 +222,30 @@ static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void
...
@@ -220,29 +222,30 @@ static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void
/**
/**
* @tc.name : sigchain_rm_special_handler_004
* @tc.name : sigchain_rm_special_handler_004
* @tc.desc :
t
he signal is not registered with the kernel, call remove_special_signal_handler to remove
* @tc.desc :
T
he signal is not registered with the kernel, call remove_special_signal_handler to remove
* a special handler.
* a special handler.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_004
()
static
void
sigchain_rm_special_handler_004
()
{
{
struct
signal_chain_action
sigsegv
=
{
g_count
=
0
;
struct
signal_chain_action
sigcont
=
{
.
sca_sigaction
=
sigchain_special_sigterm_handler
,
.
sca_sigaction
=
sigchain_special_sigterm_handler
,
.
sca_mask
=
{},
.
sca_mask
=
{},
.
sca_flags
=
0
,
.
sca_flags
=
0
,
};
};
add_special_signal_handler
(
SIG
TERM
,
&
sigsegv
);
add_special_signal_handler
(
SIG
CONT
,
&
sigcont
);
if
(
get_sigchain_mask_enable
())
{
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
TERM
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIG
CONT
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_004"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_special_handler_004"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
remove_special_signal_handler
(
SIG
TERM
,
sigchain_special_sigterm_handler
);
remove_special_signal_handler
(
SIG
CONT
,
sigchain_special_sigterm_handler
);
raise
(
SIG
TERM
);
raise
(
SIG
CONT
);
EXPECT_EQ
(
"sigchain_rm_special_handler_004"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_2
);
EXPECT_EQ
(
"sigchain_rm_special_handler_004"
,
g_count
,
0
);
}
}
/**
/**
...
@@ -266,15 +269,15 @@ static void signal_64_handler(int signo)
...
@@ -266,15 +269,15 @@ static void signal_64_handler(int signo)
/**
/**
* @tc.name : sigchain_rm_special_handler_005
* @tc.name : sigchain_rm_special_handler_005
* @tc.desc :
t
he signal is registered with the kernel(Using signal), call remove_special_signal_handler to remove
* @tc.desc :
T
he signal is registered with the kernel(Using signal), call remove_special_signal_handler to remove
* a special handler.
* a special handler.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_005
()
static
void
sigchain_rm_special_handler_005
()
{
{
g_count
=
0
;
signal
(
SIGCHAIN_SIGNAL_64
,
signal_64_handler
);
signal
(
SIGCHAIN_SIGNAL_64
,
signal_64_handler
);
struct
signal_chain_action
sighup
=
{
struct
signal_chain_action
sighup
=
{
.
sca_sigaction
=
sigchain_special_64_handler
,
.
sca_sigaction
=
sigchain_special_64_handler
,
.
sca_mask
=
{},
.
sca_mask
=
{},
...
@@ -290,7 +293,7 @@ static void sigchain_rm_special_handler_005()
...
@@ -290,7 +293,7 @@ static void sigchain_rm_special_handler_005()
remove_special_signal_handler
(
SIGCHAIN_SIGNAL_64
,
sigchain_special_64_handler
);
remove_special_signal_handler
(
SIGCHAIN_SIGNAL_64
,
sigchain_special_64_handler
);
raise
(
SIGCHAIN_SIGNAL_64
);
raise
(
SIGCHAIN_SIGNAL_64
);
EXPECT_EQ
(
"sigchain_rm_special_handler_005"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
3
);
EXPECT_EQ
(
"sigchain_rm_special_handler_005"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_
1
);
}
}
/**
/**
...
@@ -314,12 +317,13 @@ static void signal_37_sigaction(int signo)
...
@@ -314,12 +317,13 @@ static void signal_37_sigaction(int signo)
/**
/**
* @tc.name : sigchain_rm_special_handler_006
* @tc.name : sigchain_rm_special_handler_006
* @tc.desc :
t
he signal is registered with the kernel(Using sigaction), call remove_special_signal_handler
* @tc.desc :
T
he signal is registered with the kernel(Using sigaction), call remove_special_signal_handler
* to remove a special handler.
* to remove a special handler.
* @tc.level : Level 0
* @tc.level : Level 0
*/
*/
static
void
sigchain_rm_special_handler_006
()
static
void
sigchain_rm_special_handler_006
()
{
{
g_count
=
0
;
struct
sigaction
sigac
=
{
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_37_sigaction
,
.
sa_handler
=
signal_37_sigaction
,
};
};
...
@@ -340,7 +344,72 @@ static void sigchain_rm_special_handler_006()
...
@@ -340,7 +344,72 @@ static void sigchain_rm_special_handler_006()
remove_special_signal_handler
(
SIGCHAIN_SIGNAL_37
,
sigchain_special_37_handler
);
remove_special_signal_handler
(
SIGCHAIN_SIGNAL_37
,
sigchain_special_37_handler
);
raise
(
SIGCHAIN_SIGNAL_37
);
raise
(
SIGCHAIN_SIGNAL_37
);
EXPECT_EQ
(
"sigchain_rm_special_handler_006"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_4
);
EXPECT_EQ
(
"sigchain_rm_special_handler_006"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
/**
* @brief the special handler
*/
static
bool
sigchain_special_quit_handler
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
g_count
++
;
EXPECT_FALSE
(
"sigchain_rm_all_special_handler_007"
,
true
);
return
false
;
}
static
bool
sigchain_special_quit_handler1
(
int
signo
,
siginfo_t
*
siginfo
,
void
*
ucontext_raw
)
{
g_count
++
;
EXPECT_FALSE
(
"sigchain_rm_all_special_handler_007"
,
true
);
return
false
;
}
/**
* @brief the signal handler
*/
static
void
signal_quit_sigaction
(
int
signo
)
{
g_count
++
;
EXPECT_EQ
(
"sigchain_rm_all_special_handler_007"
,
signo
,
SIGQUIT
);
}
/**
* @tc.name : sigchain_rm_all_special_handler_007
* @tc.desc : The signal is registered with the kernel(Using sigaction), call remove_special_signal_handler
* to remove a special handler.
* @tc.level : Level 0
*/
static
void
sigchain_rm_all_special_handler_007
()
{
g_count
=
0
;
struct
sigaction
sigac
=
{
.
sa_handler
=
signal_quit_sigaction
,
};
sigaction
(
SIGQUIT
,
&
sigac
,
NULL
);
struct
signal_chain_action
sigquit
=
{
.
sca_sigaction
=
sigchain_special_quit_handler
,
.
sca_mask
=
{},
.
sca_flags
=
0
,
};
add_special_signal_handler
(
SIGQUIT
,
&
sigquit
);
struct
signal_chain_action
sigquit1
=
{
.
sca_sigaction
=
sigchain_special_quit_handler1
,
.
sca_mask
=
{},
.
sca_flags
=
0
,
};
add_special_signal_handler
(
SIGQUIT
,
&
sigquit1
);
if
(
get_sigchain_mask_enable
())
{
sigset_t
set
=
{
0
};
int
signo
[
SIGCHIAN_TEST_SIGNAL_NUM_1
]
=
{
SIGQUIT
};
SIGCHAIN_TEST_SET_MASK
(
set
,
"sigchain_rm_all_special_handler_007"
,
signo
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
remove_all_special_handler
(
SIGQUIT
);
raise
(
SIGQUIT
);
EXPECT_EQ
(
"sigchain_rm_all_special_handler_007"
,
g_count
,
SIGCHIAN_TEST_SIGNAL_NUM_1
);
}
}
int
main
(
void
)
int
main
(
void
)
...
@@ -351,5 +420,6 @@ int main(void)
...
@@ -351,5 +420,6 @@ int main(void)
sigchain_rm_special_handler_004
();
sigchain_rm_special_handler_004
();
sigchain_rm_special_handler_005
();
sigchain_rm_special_handler_005
();
sigchain_rm_special_handler_006
();
sigchain_rm_special_handler_006
();
sigchain_rm_all_special_handler_007
();
return
t_status
;
return
t_status
;
}
}
\ No newline at end of file
libc-test/src/functionalext/sigchain/test_src_functionalext_sigchain.gni
浏览文件 @
16f8032c
...
@@ -15,6 +15,6 @@ functionalext_sigchain_list = [
...
@@ -15,6 +15,6 @@ functionalext_sigchain_list = [
"sigchain_rm_special_handler",
"sigchain_rm_special_handler",
"sigchain_intercept_sigaction",
"sigchain_intercept_sigaction",
"sigchain_intercept_signal",
"sigchain_intercept_signal",
"sigchain_intercept_
sigproc
mask",
"sigchain_intercept_
pthread_sig
mask",
"sigchain_handler_call_order",
"sigchain_handler_call_order",
]
]
libc.map.txt
浏览文件 @
16f8032c
...
@@ -309,6 +309,7 @@
...
@@ -309,6 +309,7 @@
acoshl;
acoshl;
acosl;
acosl;
addmntent;
addmntent;
add_special_handler_at_last;
add_special_signal_handler;
add_special_signal_handler;
adjtime;
adjtime;
adjtimex;
adjtimex;
...
@@ -1487,6 +1488,7 @@
...
@@ -1487,6 +1488,7 @@
remainderl;
remainderl;
remap_file_pages;
remap_file_pages;
remove;
remove;
remove_all_special_handler;
remove_special_signal_handler;
remove_special_signal_handler;
removexattr;
removexattr;
remque;
remque;
...
...
musl_src.gni
浏览文件 @
16f8032c
...
@@ -2122,6 +2122,7 @@ musl_src_porting_file = [
...
@@ -2122,6 +2122,7 @@ musl_src_porting_file = [
"src/thread/pthread_rwlock_clockwrlock.c",
"src/thread/pthread_rwlock_clockwrlock.c",
"src/thread/pthread_rwlock_timedwrlock_monotonic_np.c",
"src/thread/pthread_rwlock_timedwrlock_monotonic_np.c",
"src/thread/pthread_rwlock_timedwrlock.c",
"src/thread/pthread_rwlock_timedwrlock.c",
"src/thread/pthread_sigmask.c",
"src/trace/trace_marker.c",
"src/trace/trace_marker.c",
"src/ldso/dlclose.c",
"src/ldso/dlclose.c",
"src/ldso/dlerror.c",
"src/ldso/dlerror.c",
...
@@ -2142,7 +2143,7 @@ musl_src_porting_file = [
...
@@ -2142,7 +2143,7 @@ musl_src_porting_file = [
"src/sched/sched_cpualloc.c",
"src/sched/sched_cpualloc.c",
"src/signal/signal.c",
"src/signal/signal.c",
"src/signal/sigaction.c",
"src/signal/sigaction.c",
"src/signal/sig
procmask
.c",
"src/signal/sig
interrupt
.c",
"include/langinfo.h",
"include/langinfo.h",
"include/locale.h",
"include/locale.h",
"src/hilog/hilog_adapter.c",
"src/hilog/hilog_adapter.c",
...
...
porting/linux/user/include/sigchain.h
浏览文件 @
16f8032c
...
@@ -38,8 +38,12 @@ struct signal_chain_action {
...
@@ -38,8 +38,12 @@ struct signal_chain_action {
/* Mark the signal to the sigchain, add the special handler to the sigchain. */
/* Mark the signal to the sigchain, add the special handler to the sigchain. */
void
add_special_signal_handler
(
int
signo
,
struct
signal_chain_action
*
sa
);
void
add_special_signal_handler
(
int
signo
,
struct
signal_chain_action
*
sa
);
/* Remove the special the handler form the sigchain. */
/* Add the special handler at the last of sigchain chains */
void
add_special_handler_at_last
(
int
signo
,
struct
signal_chain_action
*
sa
);
/* Remove the special the handler from the sigchain. */
void
remove_special_signal_handler
(
int
signo
,
bool
(
*
fn
)(
int
,
siginfo_t
*
,
void
*
));
void
remove_special_signal_handler
(
int
signo
,
bool
(
*
fn
)(
int
,
siginfo_t
*
,
void
*
));
/* Remove all special the handler from the sigchain */
void
remove_all_special_handler
(
int
signo
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
porting/linux/user/src/sigchain/sigchain.c
浏览文件 @
16f8032c
...
@@ -20,6 +20,8 @@
...
@@ -20,6 +20,8 @@
#include <threads.h>
#include <threads.h>
#include <hilog_adapter.h>
#include <hilog_adapter.h>
#include <stdlib.h>
#include <stdlib.h>
#include <errno.h>
#include "syscall.h"
extern
int
__libc_sigaction
(
int
sig
,
const
struct
sigaction
*
restrict
sa
,
extern
int
__libc_sigaction
(
int
sig
,
const
struct
sigaction
*
restrict
sa
,
struct
sigaction
*
restrict
old
);
struct
sigaction
*
restrict
old
);
...
@@ -73,12 +75,11 @@ static void create_pthread_key(void)
...
@@ -73,12 +75,11 @@ static void create_pthread_key(void)
SIGCHAIN_PRINT_INFO
(
"%{public}s create the thread key!"
,
__func__
);
SIGCHAIN_PRINT_INFO
(
"%{public}s create the thread key!"
,
__func__
);
int
rc
=
pthread_key_create
(
&
g_sigchain_key
,
NULL
);
int
rc
=
pthread_key_create
(
&
g_sigchain_key
,
NULL
);
if
(
rc
!=
0
)
{
if
(
rc
!=
0
)
{
SIGCHAIN_PRINT_
ERROR
(
"%{public}s failed to create sigchain pthread key, rc:%{public}d"
,
SIGCHAIN_PRINT_
FATAL
(
"%{public}s failed to create sigchain pthread key, rc:%{public}d"
,
__func__
,
rc
);
__func__
,
rc
);
}
}
}
}
/**
/**
* @brief Get the key of the signal thread.
* @brief Get the key of the signal thread.
* @retval int32_t, the value of the sigchain key.
* @retval int32_t, the value of the sigchain key.
...
@@ -110,12 +111,34 @@ static void set_handling_signal(bool value)
...
@@ -110,12 +111,34 @@ static void set_handling_signal(bool value)
(
void
*
)((
uintptr_t
)(
value
)));
(
void
*
)((
uintptr_t
)(
value
)));
}
}
/**
* @brief Set the mask of the system. Its prototype comes from pthread_sigmask.
* @param[in] how, the value of the mask operation .
* @param[in] set, the new value of the sigset.
* @param[in] old, the old value of the sigset.
*/
static
int
sigchain_sigmask
(
int
how
,
const
sigset_t
*
restrict
set
,
sigset_t
*
restrict
old
)
{
int
ret
;
if
(
set
&&
(
unsigned
)
how
-
SIG_BLOCK
>
2U
)
return
EINVAL
;
ret
=
-
__syscall
(
SYS_rt_sigprocmask
,
how
,
set
,
old
,
_NSIG
/
8
);
if
(
!
ret
&&
old
)
{
if
(
sizeof
old
->
__bits
[
0
]
==
8
)
{
old
->
__bits
[
0
]
&=
~
0x380000000ULL
;
}
else
{
old
->
__bits
[
0
]
&=
~
0x80000000UL
;
old
->
__bits
[
1
]
&=
~
0x3UL
;
}
}
return
ret
;
}
/**
/**
* @brief Judge whether the signal is marked
* @brief Judge whether the signal is marked
* @param[in] signo, the value of the signal.
* @param[in] signo, the value of the signal.
* @retval true if the signal is marked, or false.
* @retval true if the signal is marked, or false.
*/
*/
bool
ismarked
(
int
signo
)
static
bool
ismarked
(
int
signo
)
{
{
return
sig_chains
[
signo
-
1
].
marked
;
return
sig_chains
[
signo
-
1
].
marked
;
}
}
...
@@ -135,13 +158,13 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
...
@@ -135,13 +158,13 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
if
(
!
get_handling_signal
())
{
if
(
!
get_handling_signal
())
{
for
(
int
i
=
0
;
i
<
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
i
++
)
{
for
(
int
i
=
0
;
i
<
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
i
++
)
{
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
==
NULL
)
{
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
==
NULL
)
{
break
;
continue
;
}
}
/* The special handler might not return. */
/* The special handler might not return. */
bool
noreturn
=
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_flags
&
bool
noreturn
=
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_flags
&
SIGCHAIN_ALLOW_NORETURN
);
SIGCHAIN_ALLOW_NORETURN
);
sigset_t
previous_mask
;
sigset_t
previous_mask
;
pthread
_sigmask
(
SIG_SETMASK
,
&
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_mask
,
sigchain
_sigmask
(
SIG_SETMASK
,
&
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_mask
,
&
previous_mask
);
&
previous_mask
);
bool
previous_value
=
get_handling_signal
();
bool
previous_value
=
get_handling_signal
();
...
@@ -155,7 +178,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
...
@@ -155,7 +178,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
return
;
return
;
}
}
pthread
_sigmask
(
SIG_SETMASK
,
&
previous_mask
,
NULL
);
sigchain
_sigmask
(
SIG_SETMASK
,
&
previous_mask
,
NULL
);
set_handling_signal
(
previous_value
);
set_handling_signal
(
previous_value
);
}
}
}
}
...
@@ -170,7 +193,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
...
@@ -170,7 +193,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
sigaddset
(
&
mask
,
signo
);
sigaddset
(
&
mask
,
signo
);
}
}
pthread
_sigmask
(
SIG_SETMASK
,
&
mask
,
NULL
);
sigchain
_sigmask
(
SIG_SETMASK
,
&
mask
,
NULL
);
if
((
sa_flags
&
SA_SIGINFO
))
{
if
((
sa_flags
&
SA_SIGINFO
))
{
sig_chains
[
signo
-
1
].
sig_action
.
sa_sigaction
(
signo
,
siginfo
,
ucontext_raw
);
sig_chains
[
signo
-
1
].
sig_action
.
sa_sigaction
(
signo
,
siginfo
,
ucontext_raw
);
...
@@ -178,7 +201,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
...
@@ -178,7 +201,7 @@ static void signal_chain_handler(int signo, siginfo_t* siginfo, void* ucontext_r
if
(
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
==
SIG_IGN
)
{
if
(
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
==
SIG_IGN
)
{
return
;
return
;
}
else
if
(
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
==
SIG_DFL
)
{
}
else
if
(
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
==
SIG_DFL
)
{
SIGCHAIN_PRINT_
INFO
(
"%{public}s exiting due to SIG_DFL handler for signal: %{public}d"
,
SIGCHAIN_PRINT_
FATAL
(
"%{public}s exiting due to SIG_DFL handler for signal: %{public}d"
,
__func__
,
signo
);
__func__
,
signo
);
}
else
{
}
else
{
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
(
signo
);
sig_chains
[
signo
-
1
].
sig_action
.
sa_handler
(
signo
);
...
@@ -204,6 +227,18 @@ static void sigchain_register(int signo)
...
@@ -204,6 +227,18 @@ static void sigchain_register(int signo)
__libc_sigaction
(
signo
,
&
signal_action
,
&
sig_chains
[
signo
-
1
].
sig_action
);
__libc_sigaction
(
signo
,
&
signal_action
,
&
sig_chains
[
signo
-
1
].
sig_action
);
}
}
/**
* @brief Unregister the signal from sigchain, register the signal's user handler with the kernel if needed
* @param[in] signo, the value of the signal.
* @retval void
*/
static
void
unregister_sigchain
(
int
signo
)
{
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
__libc_sigaction
(
signo
,
&
sig_chains
[
signo
-
1
].
sig_action
,
NULL
);
sig_chains
[
signo
-
1
].
marked
=
false
;
}
/**
/**
* @brief Mark the signal to the sigchain.
* @brief Mark the signal to the sigchain.
* @param[in] signo, the value of the signal.
* @param[in] signo, the value of the signal.
...
@@ -247,7 +282,7 @@ static struct sigaction getaction(int signo)
...
@@ -247,7 +282,7 @@ static struct sigaction getaction(int signo)
* @param[in] sa, the action with special handler.
* @param[in] sa, the action with special handler.
* @retval void
* @retval void
*/
*/
void
add_special_handler
(
int
signo
,
struct
signal_chain_action
*
sa
)
static
void
add_special_handler
(
int
signo
,
struct
signal_chain_action
*
sa
)
{
{
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
for
(
int
i
=
0
;
i
<
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
i
++
)
{
for
(
int
i
=
0
;
i
<
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
i
++
)
{
...
@@ -267,17 +302,22 @@ void add_special_handler(int signo, struct signal_chain_action* sa)
...
@@ -267,17 +302,22 @@ void add_special_handler(int signo, struct signal_chain_action* sa)
* @param[in] fn, the special handler of the signal.
* @param[in] fn, the special handler of the signal.
* @retval void
* @retval void
*/
*/
void
rm_special_handler
(
int
signo
,
bool
(
*
fn
)(
int
,
siginfo_t
*
,
void
*
))
static
void
rm_special_handler
(
int
signo
,
bool
(
*
fn
)(
int
,
siginfo_t
*
,
void
*
))
{
{
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
int
len
=
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
int
len
=
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
==
fn
)
{
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
==
fn
)
{
for
(
int
j
=
i
;
j
<
len
-
1
;
++
j
)
{
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
=
NULL
;
sig_chains
[
signo
-
1
].
sca_special_actions
[
j
]
=
int
count
=
0
;
sig_chains
[
signo
-
1
].
sca_special_actions
[
j
+
1
];
for
(
int
k
=
0
;
k
<
len
;
k
++
)
{
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
k
].
sca_sigaction
==
NULL
)
{
count
++
;
}
}
if
(
count
==
len
)
{
unregister_sigchain
(
signo
);
}
}
sig_chains
[
signo
-
1
].
sca_special_actions
[
len
-
1
].
sca_sigaction
=
NULL
;
return
;
return
;
}
}
}
}
...
@@ -319,8 +359,56 @@ void remove_special_signal_handler(int signo, bool (*fn)(int, siginfo_t*, void*)
...
@@ -319,8 +359,56 @@ void remove_special_signal_handler(int signo, bool (*fn)(int, siginfo_t*, void*)
SIGCHAIN_PRINT_FATAL
(
"%{public}s Invalid signal %{public}d"
,
__func__
,
signo
);
SIGCHAIN_PRINT_FATAL
(
"%{public}s Invalid signal %{public}d"
,
__func__
,
signo
);
return
;
return
;
}
}
// remove the special handler from the sigchain.
rm_special_handler
(
signo
,
fn
);
if
(
ismarked
(
signo
))
{
// remove the special handler from the sigchain.
rm_special_handler
(
signo
,
fn
);
}
}
/**
* @brief This is an external interface, remove all special handler from the sigchain.
* @param[in] signo, the value of the signal.
* @retval void
*/
void
remove_all_special_handler
(
int
signo
)
{
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
if
(
signo
<=
0
||
signo
>=
_NSIG
)
{
SIGCHAIN_PRINT_FATAL
(
"%{public}s Invalid signal %{public}d"
,
__func__
,
signo
);
return
;
}
if
(
ismarked
(
signo
))
{
// remove all special handler from the sigchain.
for
(
int
i
=
0
;
i
<
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
;
i
++
)
{
sig_chains
[
signo
-
1
].
sca_special_actions
[
i
].
sca_sigaction
=
NULL
;
}
unregister_sigchain
(
signo
);
}
}
/**
* @brief This is an external interface, add the special handler at the last of sigchain chains.
* @param[in] signo, the value of the signal.
* @param[in] sa, the action with special handler.
* @retval void
*/
void
add_special_handler_at_last
(
int
signo
,
struct
signal_chain_action
*
sa
)
{
SIGCHAIN_PRINT_INFO
(
"%{public}s signo: %{public}d"
,
__func__
,
signo
);
if
(
signo
<=
0
||
signo
>=
_NSIG
)
{
SIGCHAIN_PRINT_FATAL
(
"%{public}s Invalid signal %{public}d"
,
__func__
,
signo
);
return
;
}
if
(
sig_chains
[
signo
-
1
].
sca_special_actions
[
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
-
1
].
sca_sigaction
==
NULL
)
{
sig_chains
[
signo
-
1
].
sca_special_actions
[
SIGNAL_CHAIN_SPECIAL_ACTION_MAX
-
1
]
=
*
sa
;
mark_signal_to_sigchain
(
signo
);
return
;
}
SIGCHAIN_PRINT_FATAL
(
"Add too many the special handlers at last!"
);
}
}
/**
/**
...
@@ -355,15 +443,15 @@ bool intercept_sigaction(int signo, const struct sigaction *restrict sa,
...
@@ -355,15 +443,15 @@ bool intercept_sigaction(int signo, const struct sigaction *restrict sa,
}
}
/**
/**
* @brief Intercept the
sigproc
mask.
* @brief Intercept the
pthread_sig
mask.
* @param[in] how, the value of the mask operation .
* @param[in] how, the value of the mask operation .
* @param[out] set, the value of the sigset.
* @param[out] set, the value of the sigset.
* @retval void.
* @retval void.
*/
*/
void
intercept_
sigproc
mask
(
int
how
,
sigset_t
*
restrict
set
)
void
intercept_
pthread_sig
mask
(
int
how
,
sigset_t
*
restrict
set
)
{
{
SIGCHAIN_PRINT_DEBUG
(
"%{public}s how: %{public}d"
,
__func__
,
how
);
SIGCHAIN_PRINT_DEBUG
(
"%{public}s how: %{public}d"
,
__func__
,
how
);
// Forward directly to the
pthread_sig
mask When this sigchain is handling a signal.
// Forward directly to the
system
mask When this sigchain is handling a signal.
if
(
get_handling_signal
())
{
if
(
get_handling_signal
())
{
return
;
return
;
}
}
...
...
porting/linux/user/src/signal/sigaction.c
浏览文件 @
16f8032c
/*
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <signal.h>
#include <signal.h>
#include <errno.h>
#include <errno.h>
#include <string.h>
#include <string.h>
...
@@ -85,10 +100,11 @@ int __sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *
...
@@ -85,10 +100,11 @@ int __sigaction(int sig, const struct sigaction *restrict sa, struct sigaction *
errno
=
EINVAL
;
errno
=
EINVAL
;
return
-
1
;
return
-
1
;
}
}
/* sigchain intercepts sigaction */
if
(
intercept_sigaction
(
sig
,
sa
,
old
))
{
if
(
intercept_sigaction
(
sig
,
sa
,
old
))
{
return
0
;
return
0
;
}
}
return
__libc_sigaction
(
sig
,
sa
,
old
);
return
__libc_sigaction
(
sig
,
sa
,
old
);
}
}
...
...
porting/linux/user/src/signal/siginterrupt.c
0 → 100644
浏览文件 @
16f8032c
/*
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <signal.h>
#include <errno.h>
extern
int
__libc_sigaction
(
int
sig
,
const
struct
sigaction
*
restrict
sa
,
struct
sigaction
*
restrict
old
);
int
siginterrupt
(
int
sig
,
int
flag
)
{
if
(
sig
-
32U
<
3
||
sig
-
1U
>=
_NSIG
-
1
)
{
errno
=
EINVAL
;
return
-
1
;
}
struct
sigaction
sa
;
__libc_sigaction
(
sig
,
0
,
&
sa
);
if
(
flag
)
sa
.
sa_flags
&=
~
SA_RESTART
;
else
sa
.
sa_flags
|=
SA_RESTART
;
return
__libc_sigaction
(
sig
,
&
sa
,
0
);
}
porting/linux/user/src/signal/sigprocmask.c
已删除
100644 → 0
浏览文件 @
423de4bb
#include <signal.h>
#include <errno.h>
#include <sigchain.h>
#include <stddef.h>
#include <hilog_adapter.h>
#include <string.h>
#ifdef OHOS_ENABLE_PARAMETER
#include "sys_param.h"
#endif
extern
void
intercept_sigprocmask
(
int
how
,
sigset_t
*
restrict
set
);
static
const
char
*
param_name
=
"musl.sigchain.procmask"
;
bool
get_sigchain_mask_enable
()
{
#ifdef OHOS_ENABLE_PARAMETER
static
CachedHandle
sigchain_procmask_handle
=
NULL
;
if
(
sigchain_procmask_handle
==
NULL
)
{
sigchain_procmask_handle
=
CachedParameterCreate
(
param_name
,
"false"
);
}
char
*
param_value
=
CachedParameterGet
(
sigchain_procmask_handle
);
if
(
param_value
!=
NULL
)
{
if
(
strcmp
(
param_value
,
"true"
)
==
0
)
{
return
true
;
}
}
#endif
return
false
;
}
int
sigprocmask
(
int
how
,
const
sigset_t
*
restrict
set
,
sigset_t
*
restrict
old
)
{
int
r
=
0
;
if
(
set
&&
get_sigchain_mask_enable
())
{
sigset_t
tmpset
=
*
set
;
intercept_sigprocmask
(
how
,
&
tmpset
);
const
sigset_t
*
new_set_ptr
=
&
tmpset
;
r
=
pthread_sigmask
(
how
,
new_set_ptr
,
old
);
}
else
{
r
=
pthread_sigmask
(
how
,
set
,
old
);
}
if
(
!
r
)
return
r
;
errno
=
r
;
return
-
1
;
}
porting/linux/user/src/thread/pthread_sigmask.c
0 → 100644
浏览文件 @
16f8032c
/*
* Copyright (c) 2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <signal.h>
#include <errno.h>
#include <sigchain.h>
#include <stddef.h>
#include <hilog_adapter.h>
#include <string.h>
#include "syscall.h"
#ifdef OHOS_ENABLE_PARAMETER
#include "sys_param.h"
#endif
extern
void
intercept_pthread_sigmask
(
int
how
,
sigset_t
*
restrict
set
);
static
const
char
*
param_name
=
"musl.sigchain.procmask"
;
/**
* @brief Get whether sigchain mask is enabled
* @retval True if the sigchain mask is enable, or false.
*/
bool
get_sigchain_mask_enable
()
{
#ifdef OHOS_ENABLE_PARAMETER
static
CachedHandle
sigchain_procmask_handle
=
NULL
;
if
(
sigchain_procmask_handle
==
NULL
)
{
sigchain_procmask_handle
=
CachedParameterCreate
(
param_name
,
"false"
);
}
char
*
param_value
=
CachedParameterGet
(
sigchain_procmask_handle
);
if
(
param_value
!=
NULL
)
{
if
(
strcmp
(
param_value
,
"true"
)
==
0
)
{
return
true
;
}
}
#endif
return
false
;
}
int
pthread_sigmask
(
int
how
,
const
sigset_t
*
restrict
set
,
sigset_t
*
restrict
old
)
{
int
ret
;
if
(
set
&&
(
unsigned
)
how
-
SIG_BLOCK
>
2U
)
return
EINVAL
;
/* sigchain intercepts pthread_sigmask */
if
(
set
&&
get_sigchain_mask_enable
())
{
sigset_t
tmpset
=
*
set
;
intercept_pthread_sigmask
(
how
,
&
tmpset
);
const
sigset_t
*
new_set_ptr
=
&
tmpset
;
ret
=
-
__syscall
(
SYS_rt_sigprocmask
,
how
,
new_set_ptr
,
old
,
_NSIG
/
8
);
}
else
{
ret
=
-
__syscall
(
SYS_rt_sigprocmask
,
how
,
set
,
old
,
_NSIG
/
8
);
}
if
(
!
ret
&&
old
)
{
if
(
sizeof
old
->
__bits
[
0
]
==
8
)
{
old
->
__bits
[
0
]
&=
~
0x380000000ULL
;
}
else
{
old
->
__bits
[
0
]
&=
~
0x80000000UL
;
old
->
__bits
[
1
]
&=
~
0x3UL
;
}
}
return
ret
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录