static inline void subprocess_leak(void) { struct sigevent sevt; pthread_mutex_t mutex; pthread_cond_t cond; pthread_t thread; sem_t sem, *psem; timer_t tm; int fd; check_pthread(pthread_create(&thread, NULL, empty, NULL)); check_pthread(pthread_mutex_init(&mutex, NULL)); check_pthread(pthread_cond_init(&cond, NULL)); check_unix(sem_init(&sem, 0, 0)); check_unix(-!(psem = sem_open(SEM_NAME, O_CREAT, 0644, 1))); sevt.sigev_notify = SIGEV_THREAD_ID; sevt.sigev_signo = SIGALRM; sevt.sigev_notify_thread_id = syscall(__NR_gettid); check_unix(timer_create(CLOCK_MONOTONIC, &sevt, &tm)); check_unix(fd = mq_open(MQ_NAME, O_RDWR | O_CREAT, 0644, NULL)); }
int main(int argc, char **argv) { unsigned char *zero_mem, *test1_mem, *test2_mem; struct sched_param param = { .sched_priority = 1 }; struct timespec zero = { .tv_sec = 0, .tv_nsec = 0 }; struct sigaction sa; zero_mem = check_mmap(mmap(0, MEMSIZE, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)); test1_mem = check_mmap(mmap(0, MEMSIZE, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = sigdebug_handler; sa.sa_flags = SA_SIGINFO; check_unix(sigaction(SIGDEBUG, &sa, NULL)); check_unix(mlockall(MCL_CURRENT | MCL_FUTURE)); check_pthread(pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m)); printf("memory read\n"); check_value("read mem", test1_mem[0], 0); pthread_set_mode_np(PTHREAD_WARNSW, 0); test2_mem = check_mmap(mmap(0, MEMSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)); check_unix(mprotect(test2_mem, MEMSIZE, PROT_READ | PROT_WRITE | PROT_EXEC)); nanosleep(&zero, NULL); pthread_set_mode_np(0, PTHREAD_WARNSW); printf("memory write after exec enable\n"); test2_mem[0] = 0xff; pthread_set_mode_np(PTHREAD_WARNSW, 0); check_unix(mprotect(test1_mem, MEMSIZE, PROT_READ | PROT_WRITE)); nanosleep(&zero, NULL); pthread_set_mode_np(0, PTHREAD_WARNSW); printf("memory write after write enable\n"); test1_mem[0] = 0xff; check_value("read zero", zero_mem[0], 0); pthread_set_mode_np(PTHREAD_WARNSW, 0); test1_mem = check_mmap(mmap(0, MEMSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0)); check_unix(mprotect(test1_mem, MEMSIZE, PROT_READ | PROT_WRITE)); printf("memory read/write after access enable\n"); check_value("read mem", test1_mem[0], 0); test1_mem[0] = 0xff; check_value("read zero", zero_mem[0], 0); fprintf(stderr, "Test OK\n"); return 0; }
int main(void) { unsigned long long before; struct sigevent sevt; pthread_mutex_t mutex; pthread_cond_t cond; int fd, failed = 0; pthread_t thread; sem_t sem, *psem; timer_t tm; __maybe_unused pid_t child; mlockall(MCL_CURRENT|MCL_FUTURE); fprintf(stderr, "Checking for leaks in posix skin objects\n"); before = get_used(); check_pthread(pthread_create(&thread, NULL, empty, NULL)); check_pthread(pthread_join(thread, NULL)); sleep(1); /* Leave some time for xnheap * deferred free */ check_used("thread", before, failed); before = get_used(); check_pthread(pthread_mutex_init(&mutex, NULL)); check_pthread(pthread_mutex_destroy(&mutex)); check_used("mutex", before, failed); before = get_used(); check_pthread(pthread_cond_init(&cond, NULL)); check_pthread(pthread_cond_destroy(&cond)); check_used("cond", before, failed); before = get_used(); check_unix(sem_init(&sem, 0, 0)); check_unix(sem_destroy(&sem)); check_used("sem", before, failed); before = get_used(); check_unix(-!(psem = sem_open(SEM_NAME, O_CREAT, 0644, 1))); check_unix(sem_close(psem)); check_unix(sem_unlink(SEM_NAME)); check_used("named sem", before, failed); before = get_used(); sevt.sigev_notify = SIGEV_THREAD_ID; sevt.sigev_signo = SIGALRM; sevt.sigev_notify_thread_id = syscall(__NR_gettid); check_unix(timer_create(CLOCK_MONOTONIC, &sevt, &tm)); check_unix(timer_delete(tm)); check_used("timer", before, failed); before = get_used(); check_unix(fd = mq_open(MQ_NAME, O_RDWR | O_CREAT, 0644, NULL)); check_unix(mq_close(fd)); check_unix(mq_unlink(MQ_NAME)); check_used("mq", before, failed); #ifdef HAVE_FORK before = get_used(); check_unix(child = fork()); if (!child) { subprocess_leak(); return EXIT_SUCCESS; } while (waitpid(child, NULL, 0) == -1 && errno == EINTR); sleep(1); /* Leave some time for xnheap * deferred free */ check_unix(sem_unlink(SEM_NAME)); check_unix(mq_unlink(MQ_NAME)); check_used("fork", before, failed); #endif return failed ? EXIT_FAILURE : EXIT_SUCCESS; }
int main(void) { unsigned long long before; struct sigevent sevt; pthread_mutex_t mutex; pthread_cond_t cond; int fd, failed = 0; pthread_t thread; sem_t sem, *psem; timer_t tm; void *shm; mlockall(MCL_CURRENT|MCL_FUTURE); fprintf(stderr, "Checking for leaks in posix skin objects\n"); before = get_used(); check_pthread(pthread_create(&thread, NULL, empty, NULL)); check_pthread(pthread_join(thread, NULL)); sleep(1); /* Leave some time for xnheap * deferred free */ check_used("thread", before, failed); before = get_used(); check_pthread(pthread_mutex_init(&mutex, NULL)); check_pthread(pthread_mutex_destroy(&mutex)); check_used("mutex", before, failed); before = get_used(); check_pthread(pthread_cond_init(&cond, NULL)); check_pthread(pthread_cond_destroy(&cond)); check_used("cond", before, failed); before = get_used(); check_unix(sem_init(&sem, 0, 0)); check_unix(sem_destroy(&sem)); check_used("sem", before, failed); before = get_used(); check_unix(-!(psem = sem_open(SEM_NAME, O_CREAT, 0644, 1))); check_unix(sem_close(psem)); check_unix(sem_unlink(SEM_NAME)); check_used("named sem", before, failed); before = get_used(); sevt.sigev_notify = SIGEV_SIGNAL; sevt.sigev_signo = SIGALRM; check_unix(timer_create(CLOCK_MONOTONIC, &sevt, &tm)); check_unix(timer_delete(tm)); check_used("timer", before, failed); before = get_used(); check_unix(fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0644)); check_unix(ftruncate(fd, SHM_SZ)); shm = mmap(NULL, SHM_SZ, PROT_READ, MAP_SHARED, fd, 0); check_unix(shm == MAP_FAILED ? -1 : 0); check_unix(munmap(shm, SHM_SZ)); check_unix(close(fd)); check_unix(shm_unlink(SHM_NAME)); check_used("shm", before, failed); before = get_used(); check_unix(fd = mq_open(MQ_NAME, O_RDWR | O_CREAT, 0644, NULL)); check_unix(mq_close(fd)); check_unix(mq_unlink(MQ_NAME)); check_used("mq", before, failed); return failed ? EXIT_FAILURE : EXIT_SUCCESS; }