void generic_free_arg(struct syscallrecord *rec) { struct syscallentry *entry; unsigned int i, call; call = rec->nr; entry = syscalls[call].entry; for_each_arg(i) { enum argtype argtype; argtype = get_argtype(entry, i); if (argtype == ARG_IOVEC) free((void *) get_argval(rec, i)); } }
static unsigned long fill_arg(struct syscallrecord *rec, unsigned int argnum) { struct syscallentry *entry; unsigned int call; enum argtype argtype; call = rec->nr; entry = syscalls[call].entry; if (argnum > entry->num_args) return 0; argtype = get_argtype(entry, argnum); switch (argtype) { case ARG_UNDEFINED: return (unsigned long) rand64(); case ARG_FD: return get_random_fd(); case ARG_LEN: return (unsigned long) get_len(); case ARG_ADDRESS: return handle_arg_address(rec, argnum); case ARG_NON_NULL_ADDRESS: return (unsigned long) get_non_null_address(); case ARG_MMAP: return (unsigned long) get_map(); case ARG_PID: return (unsigned long) get_pid(); case ARG_RANGE: return handle_arg_range(entry, argnum); case ARG_OP: /* Like ARG_LIST, but just a single value. */ return handle_arg_op(entry, argnum); case ARG_LIST: return handle_arg_list(entry, argnum); case ARG_RANDPAGE: return handle_arg_randpage(); case ARG_CPU: return (unsigned long) get_cpu(); case ARG_PATHNAME: return (unsigned long) generate_pathname(); case ARG_IOVEC: return handle_arg_iovec(entry, rec, argnum); case ARG_IOVECLEN: case ARG_SOCKADDRLEN: /* We already set the len in the ARG_IOVEC/ARG_SOCKADDR case * So here we just return what we had set there. */ return get_argval(rec, argnum); case ARG_SOCKADDR: return handle_arg_sockaddr(entry, rec, argnum); case ARG_MODE_T: return handle_arg_mode_t(); } BUG("unreachable!\n"); }
static unsigned long fill_arg(struct syscallrecord *rec, unsigned int argnum) { struct syscallentry *entry; unsigned int call; enum argtype argtype; call = rec->nr; entry = syscalls[call].entry; if (argnum > entry->num_args) return 0; argtype = get_argtype(entry, argnum); switch (argtype) { case ARG_UNDEFINED: if (RAND_BOOL()) return (unsigned long) rand64(); return (unsigned long) get_writable_address(page_size); case ARG_FD: if (RAND_BOOL()) { unsigned int i; /* If this is the 2nd or more ARG_FD, make it unique */ for (i = 0; i < argnum; i++) { enum argtype arg; arg = get_argtype(entry, i); if (arg == ARG_FD) return get_new_random_fd(); } } return get_random_fd(); case ARG_LEN: return (unsigned long) get_len(); case ARG_ADDRESS: return handle_arg_address(rec, argnum); case ARG_NON_NULL_ADDRESS: return (unsigned long) get_non_null_address(); case ARG_MMAP: return (unsigned long) get_map(); case ARG_PID: return (unsigned long) get_pid(); case ARG_RANGE: return handle_arg_range(entry, argnum); case ARG_OP: /* Like ARG_LIST, but just a single value. */ return handle_arg_op(entry, argnum); case ARG_LIST: return handle_arg_list(entry, argnum); case ARG_CPU: return (unsigned long) get_cpu(); case ARG_PATHNAME: return (unsigned long) generate_pathname(); case ARG_IOVEC: return handle_arg_iovec(entry, rec, argnum); case ARG_IOVECLEN: case ARG_SOCKADDRLEN: /* We already set the len in the ARG_IOVEC/ARG_SOCKADDR case * So here we just return what we had set there. */ return get_argval(rec, argnum); case ARG_SOCKADDR: return handle_arg_sockaddr(entry, rec, argnum); case ARG_MODE_T: return handle_arg_mode_t(); case ARG_SOCKETINFO: return (unsigned long) get_rand_socketinfo(); } BUG("unreachable!\n"); }
int align (Display *display, int argc, const char *argv[], const char *funcname, const char *usage) { RROutput outputid; XRROutputInfo *output; int ret; const char *inputarg; int screen; const char *pre_script; const char *post_script; ret = get_screen (display, argc, argv, funcname, usage, &screen); if (ret == EXIT_FAILURE) { return ret; } ret = get_argval (argc, argv, "input", funcname, usage, "Virtual core pointer", &inputarg); if (ret == EXIT_FAILURE) { return ret; } ret = get_output (display, argc, argv, funcname, usage, &outputid, &output); if (ret == EXIT_FAILURE) { return ret; } ret = get_argval (argc, argv, "pre-script", funcname, usage, "", &pre_script); if (ret == EXIT_FAILURE) { return ret; } ret = get_argval (argc, argv, "post-script", funcname, usage, "", &post_script); if (ret == EXIT_FAILURE) { return ret; } if (ret != EXIT_FAILURE) { Window root; if (verbose) { fprintf (stderr, "Output: %s\n", output->name); } root = RootWindow (display, screen); ret = run_script (pre_script); if (ret != EXIT_FAILURE) { ret = apply_transform (display, root, output->crtc, inputarg); if (ret != EXIT_FAILURE) { ret = run_script (post_script); } } } XRRFreeOutputInfo (output); return ret; }