static int open_testfile(char *filename) { int fd; /* file might be around from an earlier run, nuke it. */ (void) unlink(filename); if (rand_bool()) { fd = open_with_fopen(filename, O_RDWR); if (fd != -1) output(2, "fd[%d] = fopen(\"%s\", O_RDWR)\n", fd, filename); fcntl(fd, F_SETFL, random_fcntl_setfl_flags()); } else { const unsigned long open_flags[] = { O_DIRECT, O_DSYNC, O_SYNC, }; int flags = 0; flags = set_rand_bitmask(ARRAY_SIZE(open_flags), open_flags);; fd = open(filename, O_CREAT | flags, 0666); if (fd != -1) output(2, "fd[%d] = open(\"%s\", flags:%x)\n", fd, filename, flags); //TODO: decode flags } return fd; }
static void sanitise_epoll_ctl(struct syscallrecord *rec) { struct epoll_event *ep; ep = zmalloc(sizeof(struct epoll_event)); ep->data.fd = get_random_fd(); ep->events = set_rand_bitmask(ARRAY_SIZE(epoll_flags), epoll_flags); rec->a4 = (unsigned long) ep; }
/* * OR a random number of bits from the list of values into a bitmask, and return it. */ static unsigned long handle_arg_list(struct syscallentry *entry, unsigned int argnum) { unsigned long mask = 0; unsigned int num = 0; const unsigned long *values = NULL; get_num_and_values(entry, argnum, &num, &values); mask = set_rand_bitmask(num, values); return mask; }
static void sanitise_poll(struct syscallrecord *rec) { struct pollfd *pollfd; unsigned int i; unsigned int num_fds = rand() % 10; unsigned long flags[] = { POLLIN, POLLPRI, POLLOUT, POLLRDHUP, POLLERR, POLLHUP, POLLNVAL, POLLRDNORM, POLLRDBAND, POLLWRNORM, POLLWRBAND, POLLMSG }; pollfd = zmalloc(num_fds * sizeof(struct pollfd)); for (i = 0; i < num_fds; i++) { pollfd[i].fd = get_random_fd(); pollfd[i].events = set_rand_bitmask(ARRAY_SIZE(flags), flags); } rec->a1 = (unsigned long) pollfd; rec->a2 = num_fds; }
void netlink_gen_sockaddr(struct sockaddr **addr, socklen_t *addrlen) { struct sockaddr_nl *nl; const unsigned long nl_groups[] = { RTNLGRP_NONE, RTNLGRP_LINK, RTNLGRP_NOTIFY, RTNLGRP_NEIGH, RTNLGRP_TC, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV4_MROUTE, RTNLGRP_IPV4_ROUTE, RTNLGRP_IPV4_RULE, RTNLGRP_IPV6_IFADDR, RTNLGRP_IPV6_MROUTE, RTNLGRP_IPV6_ROUTE, RTNLGRP_IPV6_IFINFO, RTNLGRP_DECnet_IFADDR, RTNLGRP_NOP2, RTNLGRP_DECnet_ROUTE, RTNLGRP_DECnet_RULE, RTNLGRP_NOP4, RTNLGRP_IPV6_PREFIX, RTNLGRP_IPV6_RULE, RTNLGRP_ND_USEROPT, RTNLGRP_PHONET_IFADDR, RTNLGRP_PHONET_ROUTE, RTNLGRP_DCB, RTNLGRP_IPV4_NETCONF, RTNLGRP_IPV6_NETCONF, RTNLGRP_MDB, RTNLGRP_MPLS_ROUTE, RTNLGRP_NSID, }; nl = zmalloc(sizeof(struct sockaddr_nl)); nl->nl_family = PF_NETLINK; nl->nl_pid = 0; // destination is always kernel nl->nl_groups = set_rand_bitmask(ARRAY_SIZE(nl_groups), nl_groups); *addr = (struct sockaddr *) nl; *addrlen = sizeof(struct sockaddr_nl); }
unsigned int random_fcntl_setfl_flags(void) { return set_rand_bitmask(ARRAY_SIZE(fcntl_o_flags), fcntl_o_flags); }