int write_junk(const char *fname, int flags, int sync_options, uint64_t file_size) { int fd, len; uint64_t offset, generation = 0; char *buf; len = posix_memalign((void **)&buf, bufsize, bufsize); if (len) { errno = len; perror("alloc"); return 66; } fd = open(fname, flags | O_WRONLY); if (fd < 1) { perror(fname); return 64; } while (1) { len = snprintf(buf, bufsize - 1, "%d - %"PRIu64, getpid(), generation++); if (flags & O_DIRECT) { len = bufsize; offset = get_randnum_align(0, file_size - len, bufsize); } else { offset = get_randnum(0, file_size - len); } if (pwrite(fd, buf, len, offset) < 0) { perror("pwrite"); close(fd); free(buf); return 65; } if ((sync_options & SYNC_RANGE) && sync_file_range(fd, offset, len, SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER) < 0) { perror("sync_file_range"); close(fd); free(buf); return 67; } if ((sync_options & SYNC_FILE) && fsync(fd)) { perror("fsync"); close(fd); free(buf); return 68; } } return 0; }
int main(int argc, char *argv[]) { int debug = 0; if (!seed_random()) { return 1; } if (argc > 1 && strcmp(argv[1], "-d") == 0) { debug = 1; } /* FILE *fp = fopen("/dev/tty", "w"); fprintf(fp, "randasys process group is %d\n", getpgrp()); fclose(fp); */ install_signal_handlers(); while(1) { callnum = find_syscall(); args[0] = get_randnum(0, ULONG_MAX); args[1] = get_randnum(0, ULONG_MAX); args[2] = get_randnum(0, ULONG_MAX); args[3] = get_randnum(0, ULONG_MAX); args[4] = get_randnum(0, ULONG_MAX); args[5] = get_randnum(0, ULONG_MAX); if (debug) { printf("syscall(%d, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X); \r", callnum, args[0], args[1], args[2], args[3], args[4], args[5]); fflush(stdout); } syscall(callnum, args[0], args[1], args[2], args[3], args[4], args[5]); } return 0; }
int find_syscall(void) { int x; badcall: x = get_randnum(0, 384); /* poorly implemented blacklist */ switch (x) { /* don't screw with signal handling */ #ifdef SYS_signal case SYS_signal: #endif #ifdef SYS_sigaction case SYS_sigaction: #endif #ifdef SYS_sigsuspend case SYS_sigsuspend: #endif #ifdef SYS_sigpending case SYS_sigpending: #endif #ifdef SYS_sigreturn case SYS_sigreturn: #endif #ifdef SYS_sigprocmask case SYS_sigprocmask: #endif #ifdef SYS_rt_sigreturn case SYS_rt_sigreturn: #endif #ifdef SYS_rt_sigaction case SYS_rt_sigaction: #endif #ifdef SYS_rt_sigprocmask case SYS_rt_sigprocmask: #endif #ifdef SYS_rt_sigpending case SYS_rt_sigpending: #endif #ifdef SYS_rt_sigtimedwait case SYS_rt_sigtimedwait: #endif #ifdef SYS_rt_sigqueueinfo case SYS_rt_sigqueueinfo: #endif #ifdef SYS_rt_sigsuspend case SYS_rt_sigsuspend: #endif #ifdef SYS_sigaltstack case SYS_sigaltstack: #endif #ifdef SYS_settimeofday case SYS_settimeofday: #endif /* don't exit the program :P */ #ifdef SYS_exit case SYS_exit: #endif #ifdef SYS_exit_group case SYS_exit_group: #endif /* don't put it to sleep either */ #ifdef SYS_pause case SYS_pause: #endif #ifdef SYS_select case SYS_select: #endif #ifdef SYS_read case SYS_read: #endif #ifdef SYS_write case SYS_write: #endif /* these can fill the process table */ #ifdef SYS_fork case SYS_fork: #endif #ifdef SYS_vfork case SYS_vfork: #endif #ifdef SYS_clone case SYS_clone: #endif /* This causes OOM conditions */ #if 1 #ifdef SYS_brk case SYS_brk: #endif #endif /* these get our program killed */ #ifdef SYS_vm86 case SYS_vm86: #endif #ifdef SYS_vm86old case SYS_vm86old: #endif goto badcall; } return x; }
int mmap_junk(const char *fname, int flags, int sync_options, uint64_t file_size) { int fd, len; uint64_t offset, generation = 0; char *buf, *map; long page_size; page_size = sysconf(_SC_PAGESIZE); if (page_size < 0) { perror("_SC_PAGESIZE"); return 101; } fd = open(fname, flags | O_RDWR); if (fd < 1) { perror(fname); return 96; } len = posix_memalign((void **)&buf, bufsize, bufsize); if (len) { errno = len; perror("alloc"); return 102; } map = mmap(NULL, file_size, PROT_WRITE, MAP_SHARED, fd, 0); if (map == MAP_FAILED) { perror(fname); return 97; } while (1) { len = snprintf(buf, bufsize - 1, "%d - %"PRIu64, getpid(), generation++); if (flags & O_DIRECT) { len = bufsize; offset = get_randnum_align(0, file_size - len, bufsize); } else { offset = get_randnum(0, file_size - len); } memcpy(map + offset, buf, len); len += offset & (page_size - 1); offset &= ~(page_size - 1); if ((sync_options & SYNC_RANGE) && msync(map + offset, len, MS_SYNC | MS_INVALIDATE)) { perror("msync"); munmap(map, file_size); close(fd); free(buf); return 99; } if ((sync_options & SYNC_FILE) && fsync(fd)) { perror("fsync"); munmap(map, file_size); close(fd); free(buf); return 100; } } return 0; }