9
9
#include " src/setjmp/siglongjmp.h"
10
10
#include " src/setjmp/sigsetjmp.h"
11
11
#include " src/signal/sigprocmask.h"
12
- #include " src/string/memory_utils/inline_memcmp .h"
13
- #include " src/string/memory_utils/inline_memset .h"
12
+ #include " src/string/memcmp .h"
13
+ #include " src/string/memset .h"
14
14
#include " test/UnitTest/Test.h"
15
15
16
16
constexpr int MAX_LOOP = 123 ;
@@ -21,56 +21,82 @@ void jump_back(jmp_buf buf, int n) {
21
21
LIBC_NAMESPACE::siglongjmp (buf, n); // Will return |n| out of setjmp
22
22
}
23
23
24
- #define SMOKE_TESTS (SUFFIX, FLAG ) \
25
- TEST (LlvmLibcSetJmpTest, SigSetAndJumpBack##SUFFIX) { \
26
- jmp_buf buf; \
27
- longjmp_called = 0 ; \
28
- volatile int n = 0 ; \
29
- sigset_t old; \
30
- sigset_t mask_all; \
31
- sigset_t recovered; \
32
- LIBC_NAMESPACE::inline_memset (&mask_all, 0xFF , sizeof (mask_all)); \
33
- LIBC_NAMESPACE::inline_memset (&old, 0 , sizeof (old)); \
34
- LIBC_NAMESPACE::inline_memset (&recovered, 0 , sizeof (recovered)); \
35
- LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old); \
36
- if (LIBC_NAMESPACE::sigsetjmp (buf, FLAG) <= MAX_LOOP) { \
37
- if (FLAG) { \
38
- LIBC_NAMESPACE::sigprocmask (0 , nullptr , &recovered); \
39
- ASSERT_EQ ( \
40
- 0 , LIBC_NAMESPACE::inline_memcmp (&old, &recovered, sizeof (old))); \
41
- } \
42
- n = n + 1 ; \
43
- if (FLAG) \
44
- LIBC_NAMESPACE::sigprocmask (SIG_BLOCK, &mask_all, nullptr ); \
45
- jump_back (buf, n); \
46
- } \
47
- ASSERT_EQ (longjmp_called, n); \
48
- ASSERT_EQ (n, MAX_LOOP + 1 ); \
49
- } \
50
- TEST (LlvmLibcSetJmpTest, SigSetAndJumpBackValOne##SUFFIX) { \
51
- jmp_buf buf; \
52
- longjmp_called = 0 ; \
53
- sigset_t old; \
54
- sigset_t mask_all; \
55
- sigset_t recovered; \
56
- LIBC_NAMESPACE::inline_memset (&mask_all, 0xFF , sizeof (mask_all)); \
57
- LIBC_NAMESPACE::inline_memset (&old, 0 , sizeof (old)); \
58
- LIBC_NAMESPACE::inline_memset (&recovered, 0 , sizeof (recovered)); \
59
- LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old); \
60
- int val = LIBC_NAMESPACE::sigsetjmp (buf, FLAG); \
61
- if (val == 0 ) { \
62
- if (FLAG) \
63
- LIBC_NAMESPACE::sigprocmask (SIG_BLOCK, &mask_all, nullptr ); \
64
- jump_back (buf, val); \
65
- } \
66
- if (FLAG) { \
67
- LIBC_NAMESPACE::sigprocmask (0 , nullptr , &recovered); \
68
- ASSERT_EQ (0 , \
69
- LIBC_NAMESPACE::inline_memcmp (&old, &recovered, sizeof (old))); \
70
- } \
71
- ASSERT_EQ (longjmp_called, 1 ); \
72
- ASSERT_EQ (val, 1 ); \
24
+ TEST (LlvmLibcSetJmpTest, SigSetAndJumpBackSaveSigs) {
25
+ jmp_buf buf;
26
+ longjmp_called = 0 ;
27
+ volatile int n = 0 ;
28
+ sigset_t old;
29
+ sigset_t mask_all;
30
+ sigset_t recovered;
31
+ LIBC_NAMESPACE::memset (&mask_all, 0xFF , sizeof (mask_all));
32
+ LIBC_NAMESPACE::memset (&old, 0 , sizeof (old));
33
+ LIBC_NAMESPACE::memset (&recovered, 0 , sizeof (recovered));
34
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old);
35
+ if (LIBC_NAMESPACE::sigsetjmp (buf, 1 ) <= MAX_LOOP) {
36
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &recovered);
37
+ ASSERT_EQ (0 , LIBC_NAMESPACE::memcmp (&old, &recovered, sizeof (old)));
38
+ n = n + 1 ;
39
+ LIBC_NAMESPACE::sigprocmask (SIG_BLOCK, &mask_all, nullptr );
40
+ jump_back (buf, n);
73
41
}
42
+ ASSERT_EQ (longjmp_called, n);
43
+ ASSERT_EQ (n, MAX_LOOP + 1 );
44
+ }
74
45
75
- SMOKE_TESTS (SaveSigs, 1 )
76
- SMOKE_TESTS(NoSaveSigs, 0 )
46
+ TEST (LlvmLibcSetJmpTest, SigSetAndJumpBackValOneSaveSigs) {
47
+ jmp_buf buf;
48
+ longjmp_called = 0 ;
49
+ sigset_t old;
50
+ sigset_t mask_all;
51
+ sigset_t recovered;
52
+ LIBC_NAMESPACE::memset (&mask_all, 0xFF , sizeof (mask_all));
53
+ LIBC_NAMESPACE::memset (&old, 0 , sizeof (old));
54
+ LIBC_NAMESPACE::memset (&recovered, 0 , sizeof (recovered));
55
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old);
56
+ int val = LIBC_NAMESPACE::sigsetjmp (buf, 1 );
57
+ if (val == 0 ) {
58
+ LIBC_NAMESPACE::sigprocmask (SIG_BLOCK, &mask_all, nullptr );
59
+ jump_back (buf, val);
60
+ }
61
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &recovered);
62
+ ASSERT_EQ (0 , LIBC_NAMESPACE::memcmp (&old, &recovered, sizeof (old)));
63
+ ASSERT_EQ (longjmp_called, 1 );
64
+ ASSERT_EQ (val, 1 );
65
+ }
66
+
67
+ TEST (LlvmLibcSetJmpTest, SigSetAndJumpBackNoSaveSigs) {
68
+ jmp_buf buf;
69
+ longjmp_called = 0 ;
70
+ volatile int n = 0 ;
71
+ sigset_t old;
72
+ sigset_t mask_all;
73
+ sigset_t recovered;
74
+ LIBC_NAMESPACE::memset (&mask_all, 0xFF , sizeof (mask_all));
75
+ LIBC_NAMESPACE::memset (&old, 0 , sizeof (old));
76
+ LIBC_NAMESPACE::memset (&recovered, 0 , sizeof (recovered));
77
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old);
78
+ if (LIBC_NAMESPACE::sigsetjmp (buf, 0 ) <= MAX_LOOP) {
79
+ n = n + 1 ;
80
+ jump_back (buf, n);
81
+ }
82
+ ASSERT_EQ (longjmp_called, n);
83
+ ASSERT_EQ (n, MAX_LOOP + 1 );
84
+ }
85
+
86
+ TEST (LlvmLibcSetJmpTest, SigSetAndJumpBackValOneNoSaveSigs) {
87
+ jmp_buf buf;
88
+ longjmp_called = 0 ;
89
+ sigset_t old;
90
+ sigset_t mask_all;
91
+ sigset_t recovered;
92
+ LIBC_NAMESPACE::memset (&mask_all, 0xFF , sizeof (mask_all));
93
+ LIBC_NAMESPACE::memset (&old, 0 , sizeof (old));
94
+ LIBC_NAMESPACE::memset (&recovered, 0 , sizeof (recovered));
95
+ LIBC_NAMESPACE::sigprocmask (0 , nullptr , &old);
96
+ int val = LIBC_NAMESPACE::sigsetjmp (buf, 0 );
97
+ if (val == 0 ) {
98
+ jump_back (buf, val);
99
+ }
100
+ ASSERT_EQ (longjmp_called, 1 );
101
+ ASSERT_EQ (val, 1 );
102
+ }
0 commit comments