sigaltstack()'s reported previous state uses a somewhat odd convention, but the concept of flag bits is new, and we can do the flag bits sensibly. Specifically, let's just report them directly. This will allow saving and restoring the sigaltstack state using sigaltstack() to work correctly.
Unified · Split
| @@ -3099,7 +3099,8 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s · 3098 unmodified lines | ||
| 3099 | 3099 | |
| 3100 | 3100 | oss.ss_sp = (void __user *) current->sas_ss_sp; |
| 3101 | 3101 | oss.ss_size = current->sas_ss_size; |
| 3102 | − oss.ss_flags = sas_ss_flags(sp); | |
| 3102 | + oss.ss_flags = sas_ss_flags(sp) | | |
| 3103 | + (current->sas_ss_flags & SS_FLAG_BITS); | |
| 3103 | 3104 | |
| 3104 | 3105 | if (uss) { |
| 3105 | 3106 | void __user *ss_sp; |
| @@ -113,6 +113,19 @@ int main(void) · 112 unmodified lines | ||
| 113 | 113 | perror("mmap()"); |
| 114 | 114 | return EXIT_FAILURE; |
| 115 | 115 | } |
| 116 | + | |
| 117 | + err = sigaltstack(NULL, &stk); | |
| 118 | + if (err) { | |
| 119 | + perror("[FAIL]\tsigaltstack()"); | |
| 120 | + exit(EXIT_FAILURE); | |
| 121 | + } | |
| 122 | + if (stk.ss_flags == SS_DISABLE) { | |
| 123 | + printf("[OK]\tInitial sigaltstack state was SS_DISABLE\n"); | |
| 124 | + } else { | |
| 125 | + printf("[FAIL]\tInitial sigaltstack state was %i; should have been SS_DISABLE\n", stk.ss_flags); | |
| 126 | + return EXIT_FAILURE; | |
| 127 | + } | |
| 128 | + | |
| 116 | 129 | stk.ss_sp = sstack; |
| 117 | 130 | stk.ss_size = SIGSTKSZ; |
| 118 | 131 | stk.ss_flags = SS_ONSTACK | SS_AUTODISARM; |
| @@ -151,12 +164,12 @@ int main(void) · 32 unmodified lines | ||
| 151 | 164 | perror("[FAIL]\tsigaltstack()"); |
| 152 | 165 | exit(EXIT_FAILURE); |
| 153 | 166 | } |
| 154 | − if (stk.ss_flags != 0) { | |
| 155 | − printf("[FAIL]\tss_flags=%i, should be 0\n", | |
| 167 | + if (stk.ss_flags != SS_AUTODISARM) { | |
| 168 | + printf("[FAIL]\tss_flags=%i, should be SS_AUTODISARM\n", | |
| 156 | 169 | stk.ss_flags); |
| 157 | 170 | exit(EXIT_FAILURE); |
| 158 | 171 | } |
| 159 | − printf("[OK]\tsigaltstack is enabled after signal\n"); | |
| 172 | + printf("[OK]\tsigaltstack is still SS_AUTODISARM after signal\n"); | |
| 160 | 173 | |
| 161 | 174 | printf("[OK]\tTest passed\n"); |
| 162 | 175 | return 0; |