99#include " src/setjmp/siglongjmp.h"
1010#include " src/setjmp/sigsetjmp.h"
1111#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"
1414#include " test/UnitTest/Test.h"
1515
1616constexpr int MAX_LOOP = 123 ;
@@ -21,56 +21,82 @@ void jump_back(jmp_buf buf, int n) {
2121 LIBC_NAMESPACE::siglongjmp (buf, n); // Will return |n| out of setjmp
2222}
2323
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);
7341 }
42+ ASSERT_EQ (longjmp_called, n);
43+ ASSERT_EQ (n, MAX_LOOP + 1 );
44+ }
7445
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