int alloc_buffer( size_t bsize, int uflag, unsigned int seed) { if (vectors) return alloc_iovec(bsize, uflag, seed); if (bsize > highwater) { if (buffer) free(buffer); buffer = memalign(pagesize, bsize); if (!buffer) { perror("memalign"); highwater = buffersize = 0; return -1; } highwater = bsize; } buffersize = bsize; if (!uflag) memset(buffer, seed, buffersize); return 0; }
static unsigned long handle_arg_iovec(struct syscallentry *entry, struct syscallrecord *rec, unsigned int argnum) { unsigned long num_entries; num_entries = RAND_RANGE(1, 256); switch (argnum) { case 1: if (entry->arg2type == ARG_IOVECLEN) rec->a2 = num_entries; break; case 2: if (entry->arg3type == ARG_IOVECLEN) rec->a3 = num_entries; break; case 3: if (entry->arg4type == ARG_IOVECLEN) rec->a4 = num_entries; break; case 4: if (entry->arg5type == ARG_IOVECLEN) rec->a5 = num_entries; break; case 5: if (entry->arg6type == ARG_IOVECLEN) rec->a6 = num_entries; break; } return (unsigned long) alloc_iovec(num_entries); }
/* * SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) */ static void sanitise_sendmsg(struct syscallrecord *rec) { struct socketinfo *si = (struct socketinfo *) rec->a1; struct msghdr *msg; struct sockaddr *sa = NULL; socklen_t salen = 0; if (si == NULL) // handle --disable-fds=sockets goto skip_si; rec->a1 = fd_from_socketinfo((struct socketinfo *) rec->a1); generate_sockaddr((struct sockaddr **) &sa, (socklen_t *) &salen, si->triplet.family); skip_si: msg = zmalloc(sizeof(struct msghdr)); msg->msg_name = sa; msg->msg_namelen = salen; if (RAND_BOOL()) { unsigned int num_entries; num_entries = RAND_RANGE(1, 3); msg->msg_iov = alloc_iovec(num_entries); msg->msg_iovlen = num_entries; } if (RAND_BOOL()) { msg->msg_controllen = rand32() % 20480; // /proc/sys/net/core/optmem_max msg->msg_control = get_address(); } else { msg->msg_controllen = 0; } if (ONE_IN(100)) msg->msg_flags = rand32(); else msg->msg_flags = 0; rec->a2 = (unsigned long) msg; }