tests/tcg: Test that sigreturn() does not corrupt the signal mask
Add a small test to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Message-ID: <20241108145237.37377-2-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
		
							parent
							
								
									fb7f3572b1
								
							
						
					
					
						commit
						ef7e76a2cd
					
				@ -42,6 +42,9 @@ munmap-pthread: LDFLAGS+=-pthread
 | 
				
			|||||||
vma-pthread: CFLAGS+=-pthread
 | 
					vma-pthread: CFLAGS+=-pthread
 | 
				
			||||||
vma-pthread: LDFLAGS+=-pthread
 | 
					vma-pthread: LDFLAGS+=-pthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sigreturn-sigmask: CFLAGS+=-pthread
 | 
				
			||||||
 | 
					sigreturn-sigmask: LDFLAGS+=-pthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The vma-pthread seems very sensitive on gitlab and we currently
 | 
					# The vma-pthread seems very sensitive on gitlab and we currently
 | 
				
			||||||
# don't know if its exposing a real bug or the test is flaky.
 | 
					# don't know if its exposing a real bug or the test is flaky.
 | 
				
			||||||
ifneq ($(GITLAB_CI),)
 | 
					ifneq ($(GITLAB_CI),)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										51
									
								
								tests/tcg/multiarch/sigreturn-sigmask.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								tests/tcg/multiarch/sigreturn-sigmask.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Test that sigreturn() does not corrupt the signal mask.
 | 
				
			||||||
 | 
					 * Block SIGUSR2 and handle SIGUSR1.
 | 
				
			||||||
 | 
					 * Then sigwait() SIGUSR2, which relies on it remaining blocked.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: GPL-2.0-or-later
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int seen_sig = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void signal_func(int sig)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    seen_sig = sig;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void *thread_func(void *arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    kill(getpid(), SIGUSR2);
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct sigaction act = {
 | 
				
			||||||
 | 
					        .sa_handler = signal_func,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    pthread_t thread;
 | 
				
			||||||
 | 
					    sigset_t set;
 | 
				
			||||||
 | 
					    int sig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(sigaction(SIGUSR1, &act, NULL) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(sigemptyset(&set) == 0);
 | 
				
			||||||
 | 
					    assert(sigaddset(&set, SIGUSR2) == 0);
 | 
				
			||||||
 | 
					    assert(sigprocmask(SIG_BLOCK, &set, NULL) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    kill(getpid(), SIGUSR1);
 | 
				
			||||||
 | 
					    assert(seen_sig == SIGUSR1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(pthread_create(&thread, NULL, thread_func, NULL) == 0);
 | 
				
			||||||
 | 
					    assert(sigwait(&set, &sig) == 0);
 | 
				
			||||||
 | 
					    assert(sig == SIGUSR2);
 | 
				
			||||||
 | 
					    assert(pthread_join(thread, NULL) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user