move_pages: just use calloc
[trinity.git] / syscalls / send.c
blob779e853f643fbedbf58d7634b89c4dfcc09c645b
1 /*
2 * SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
3 unsigned, flags)
4 */
5 #include <stdlib.h>
6 #include <sys/types.h>
7 #include <sys/socket.h>
8 #include "compat.h"
9 #include "random.h"
10 #include "sanitise.h"
11 #include "maps.h"
12 #include "shm.h"
14 struct syscallentry syscall_send = {
15 .name = "send",
16 .num_args = 4,
17 .arg1name = "fd",
18 .arg1type = ARG_FD,
19 .arg2name = "buff",
20 .arg2type = ARG_ADDRESS,
21 .arg3name = "len",
22 .arg3type = ARG_LEN,
23 .arg4name = "flags",
24 .arg4type = ARG_LIST,
25 .arg4list = {
26 .num = 20,
27 .values = { MSG_OOB, MSG_PEEK, MSG_DONTROUTE, MSG_CTRUNC,
28 MSG_PROBE, MSG_TRUNC, MSG_DONTWAIT, MSG_EOR,
29 MSG_WAITALL, MSG_FIN, MSG_SYN, MSG_CONFIRM,
30 MSG_RST, MSG_ERRQUEUE, MSG_NOSIGNAL, MSG_MORE,
31 MSG_WAITFORONE, MSG_FASTOPEN, MSG_CMSG_CLOEXEC, MSG_CMSG_COMPAT,
38 * SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
39 unsigned, flags, struct sockaddr __user *, addr,
40 int, addr_len)
42 struct syscallentry syscall_sendto = {
43 .name = "sendto",
44 .num_args = 6,
45 .arg1name = "fd",
46 .arg1type = ARG_FD,
47 .arg2name = "buff",
48 .arg2type = ARG_ADDRESS,
49 .arg3name = "len",
50 .arg3type = ARG_LEN,
51 .arg4name = "flags",
52 .arg4type = ARG_LIST,
53 .arg4list = {
54 .num = 20,
55 .values = { MSG_OOB, MSG_PEEK, MSG_DONTROUTE, MSG_CTRUNC,
56 MSG_PROBE, MSG_TRUNC, MSG_DONTWAIT, MSG_EOR,
57 MSG_WAITALL, MSG_FIN, MSG_SYN, MSG_CONFIRM,
58 MSG_RST, MSG_ERRQUEUE, MSG_NOSIGNAL, MSG_MORE,
59 MSG_WAITFORONE, MSG_FASTOPEN, MSG_CMSG_CLOEXEC, MSG_CMSG_COMPAT },
61 .arg5name = "addr",
62 .arg5type = ARG_SOCKADDR,
63 .arg6name = "addr_len",
64 .arg6type = ARG_SOCKADDRLEN,
65 .flags = NEED_ALARM,
70 * SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
72 static void sanitise_sendmsg(int childno)
74 struct msghdr *msg;
75 struct sockaddr *sa = NULL;
76 socklen_t salen;
78 msg = malloc(sizeof(struct msghdr));
79 shm->scratch[childno] = (unsigned long) msg;
81 if (msg == NULL) {
82 // just do something weird.
83 shm->syscall[childno].a2 = (unsigned long) get_address();
84 return;
87 generate_sockaddr((struct sockaddr **) &sa, (socklen_t *) &salen, rand() % TRINITY_PF_MAX);
89 msg->msg_name = sa;
90 msg->msg_namelen = salen;
92 msg->msg_iov = get_address();
93 msg->msg_iovlen = get_len();
94 msg->msg_control = get_address();
95 msg->msg_controllen = get_len();
96 msg->msg_flags = rand32();
98 shm->syscall[childno].a2 = (unsigned long) msg;
101 static void post_sendmsg(int childno)
103 struct msghdr *msg;
104 void *ptr = (void *) shm->scratch[childno];
106 if (ptr != NULL) {
107 msg = (struct msghdr *) ptr;
109 if (msg->msg_name != page_rand) // FIXME: What about other kinds of pages ?
110 free(msg->msg_name); // free sockaddr
112 free(ptr);
115 shm->scratch[childno] = 0;
118 struct syscallentry syscall_sendmsg = {
119 .name = "sendmsg",
120 .num_args = 3,
121 .arg1name = "fd",
122 .arg1type = ARG_FD,
123 .arg2name = "msg",
124 .arg3name = "flags",
125 .arg3type = ARG_LIST,
126 .arg3list = {
127 .num = 20,
128 .values = { MSG_OOB, MSG_PEEK, MSG_DONTROUTE, MSG_CTRUNC,
129 MSG_TRUNC, MSG_DONTWAIT, MSG_EOR,
130 MSG_WAITALL, MSG_FIN, MSG_SYN, MSG_CONFIRM,
131 MSG_RST, MSG_ERRQUEUE, MSG_NOSIGNAL, MSG_MORE,
132 MSG_WAITFORONE, MSG_CMSG_CLOEXEC, MSG_FASTOPEN, MSG_CMSG_COMPAT },
134 .sanitise = sanitise_sendmsg,
135 .post = post_sendmsg,
136 .flags = NEED_ALARM,
139 * SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,
140 * unsigned int, vlen, unsigned int, flags)
142 struct syscallentry syscall_sendmmsg = {
143 .name = "sendmmsg",
144 .num_args = 4,
145 .arg1name = "fd",
146 .arg1type = ARG_FD,
147 .arg2name = "mmsg",
148 .arg2type = ARG_ADDRESS,
149 .arg3name = "vlen",
150 .arg3type = ARG_LEN,
151 .arg4name = "flags",
152 .arg4type = ARG_LIST,
153 .arg4list = {
154 .num = 20,
155 .values = { MSG_OOB, MSG_PEEK, MSG_DONTROUTE, MSG_CTRUNC,
156 MSG_PROBE, MSG_TRUNC, MSG_DONTWAIT, MSG_EOR,
157 MSG_WAITALL, MSG_FIN, MSG_SYN, MSG_CONFIRM,
158 MSG_RST, MSG_ERRQUEUE, MSG_NOSIGNAL, MSG_MORE,
159 MSG_WAITFORONE, MSG_CMSG_CLOEXEC, MSG_FASTOPEN, MSG_CMSG_COMPAT },
161 .flags = NEED_ALARM,