OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2012 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. |
| 5 */ |
| 6 /* |
| 7 * Here we are testing that return values and errno's are correctly received |
| 8 * from intercepted syscalls and parameter gets passed to syscall correctly. |
| 9 */ |
| 10 #include <arpa/inet.h> |
| 11 #include <assert.h> |
| 12 #include <errno.h> |
| 13 #include <netdb.h> |
| 14 #include <netinet/in.h> |
| 15 #include <stdio.h> |
| 16 #include <string.h> |
| 17 #include <sys/socket.h> |
| 18 #include <sys/types.h> |
| 19 #include <irt_syscalls.h> |
| 20 |
| 21 int test_var; |
| 22 struct sockaddr_in s_in; |
| 23 |
| 24 #define REGISTER_WRAPPER_IN_GLIBC(name) do { \ |
| 25 __nacl_irt_##name = __nacl_irt_##name##_wrap; \ |
| 26 } while (0) |
| 27 #define WRAP(name) __nacl_irt_##name##_wrap |
| 28 |
| 29 int WRAP(socket) (int domain, int type, int protocol, int* ret) { |
| 30 ++test_var; |
| 31 *ret = 51; |
| 32 return 0; |
| 33 } |
| 34 |
| 35 int WRAP(accept)(int sockfd, struct sockaddr* addr, socklen_t* addrlen, |
| 36 int* ret) { |
| 37 ++test_var; |
| 38 *addrlen = 52; |
| 39 *ret = 23; |
| 40 return 0; |
| 41 } |
| 42 |
| 43 int WRAP(bind) (int sockfd, const struct sockaddr* addr, socklen_t addrlen) { |
| 44 ++test_var; |
| 45 return sockfd > 0 ? 0 : -53; |
| 46 } |
| 47 |
| 48 int WRAP(listen) (int sockfd, int backlog) { |
| 49 ++test_var; |
| 50 return sockfd > 0 ? 0 : -54; |
| 51 } |
| 52 |
| 53 int WRAP(connect) (int sockfd, const struct sockaddr* addr, |
| 54 socklen_t addrlen) { |
| 55 ++test_var; |
| 56 assert((void*)&s_in == (void*)addr); |
| 57 return sockfd > 0 ? 0 : -55; |
| 58 } |
| 59 |
| 60 int WRAP(send) (int sockfd, const void *buf, size_t len, int flags, |
| 61 int* ret) { |
| 62 ++test_var; |
| 63 *ret = 56; |
| 64 return 0; |
| 65 } |
| 66 |
| 67 int WRAP(sendto) (int sockfd, const void *buf, size_t len, int flags, |
| 68 const struct sockaddr *dest_addr, socklen_t addrlen, |
| 69 int* ret) { |
| 70 ++test_var; |
| 71 *ret = 57; |
| 72 return 0; |
| 73 } |
| 74 |
| 75 int WRAP(sendmsg) (int sockfd, const struct msghdr *msg, int flags, |
| 76 int* ret) { |
| 77 ++test_var; |
| 78 *ret = 58; |
| 79 return 0; |
| 80 } |
| 81 |
| 82 int WRAP(recv) (int sockfd, void *buf, size_t len, int flags, int* ret) { |
| 83 ++test_var; |
| 84 *ret = 59; |
| 85 return 0; |
| 86 } |
| 87 |
| 88 int WRAP(recvfrom) (int sockfd, void *buf, size_t len, int flags, |
| 89 struct sockaddr *src_addr, socklen_t* addrlen, |
| 90 int* ret) { |
| 91 ++test_var; |
| 92 *ret = 60; |
| 93 return 0; |
| 94 } |
| 95 |
| 96 int WRAP(recvmsg) (int sockfd, struct msghdr *msg, int flags, int* ret) { |
| 97 ++test_var; |
| 98 *ret = 61; |
| 99 return 0; |
| 100 } |
| 101 |
| 102 int WRAP(getsockname) (int sockfd, struct sockaddr *addr, |
| 103 socklen_t* addrlen) { |
| 104 ++test_var; |
| 105 *addrlen = 62; |
| 106 return 0; |
| 107 } |
| 108 |
| 109 int WRAP(getpeername) (int sockfd, struct sockaddr *addr, |
| 110 socklen_t* addrlen) { |
| 111 ++test_var; |
| 112 *addrlen = 63; |
| 113 return 0; |
| 114 } |
| 115 |
| 116 int WRAP(setsockopt) (int sockfd, int level, int optname, const void *optval, |
| 117 socklen_t optlen) { |
| 118 ++test_var; |
| 119 return -64; |
| 120 } |
| 121 |
| 122 int WRAP(getsockopt) (int sockfd, int level, int optname, void *optval, |
| 123 socklen_t* optlen) { |
| 124 ++test_var; |
| 125 return -65; |
| 126 } |
| 127 |
| 128 int WRAP(epoll_create) (int size, int *sd) { |
| 129 ++test_var; |
| 130 *sd = 5; |
| 131 return -66; |
| 132 } |
| 133 |
| 134 int WRAP(epoll_ctl) (int epfd, int op, int fd, struct epoll_event *event) { |
| 135 ++test_var; |
| 136 return -67; |
| 137 } |
| 138 |
| 139 int WRAP(epoll_wait) (int epfd, struct epoll_event *events, |
| 140 int maxevents, int timeout, int* count) { |
| 141 ++test_var; |
| 142 *count = 0; |
| 143 return -68; |
| 144 } |
| 145 |
| 146 int WRAP(epoll_pwait) (int epfd, struct epoll_event *events, |
| 147 int maxevents, int timeout, const sigset_t *sigmask, |
| 148 size_t sigset_size, int *count) { |
| 149 ++test_var; |
| 150 *count = 0; |
| 151 return -69; |
| 152 } |
| 153 |
| 154 int WRAP(poll) (struct pollfd *fds, nfds_t nfds, int timeout, int *count) { |
| 155 ++test_var; |
| 156 *count = 0; |
| 157 return -70; |
| 158 } |
| 159 |
| 160 int WRAP(ppoll) (struct pollfd *fds, nfds_t nfds, |
| 161 const struct timespec *timeout, const sigset_t *sigmask, |
| 162 size_t sigset_size, int *count) { |
| 163 ++test_var; |
| 164 *count = 0; |
| 165 return -71; |
| 166 } |
| 167 |
| 168 #define DIRSIZE 8192 |
| 169 #define PORT 0x1234 |
| 170 int main(int argc, char** argv) { |
| 171 REGISTER_WRAPPER_IN_GLIBC(socket); |
| 172 REGISTER_WRAPPER_IN_GLIBC(accept); |
| 173 REGISTER_WRAPPER_IN_GLIBC(bind); |
| 174 REGISTER_WRAPPER_IN_GLIBC(connect); |
| 175 REGISTER_WRAPPER_IN_GLIBC(listen); |
| 176 REGISTER_WRAPPER_IN_GLIBC(recv); |
| 177 REGISTER_WRAPPER_IN_GLIBC(recvmsg); |
| 178 REGISTER_WRAPPER_IN_GLIBC(recvfrom); |
| 179 REGISTER_WRAPPER_IN_GLIBC(send); |
| 180 REGISTER_WRAPPER_IN_GLIBC(sendto); |
| 181 REGISTER_WRAPPER_IN_GLIBC(sendmsg); |
| 182 REGISTER_WRAPPER_IN_GLIBC(setsockopt); |
| 183 REGISTER_WRAPPER_IN_GLIBC(getsockopt); |
| 184 REGISTER_WRAPPER_IN_GLIBC(getpeername); |
| 185 REGISTER_WRAPPER_IN_GLIBC(getsockname); |
| 186 REGISTER_WRAPPER_IN_GLIBC(epoll_create); |
| 187 REGISTER_WRAPPER_IN_GLIBC(epoll_ctl); |
| 188 REGISTER_WRAPPER_IN_GLIBC(epoll_wait); |
| 189 REGISTER_WRAPPER_IN_GLIBC(epoll_pwait); |
| 190 REGISTER_WRAPPER_IN_GLIBC(poll); |
| 191 REGISTER_WRAPPER_IN_GLIBC(ppoll); |
| 192 |
| 193 char dir[DIRSIZE]; |
| 194 int sd, sd_current, ret; |
| 195 socklen_t addrlen; |
| 196 struct sockaddr_in pin; |
| 197 struct msghdr msg; |
| 198 struct epoll_event event; |
| 199 struct pollfd pollfds; |
| 200 struct timespec timeout; |
| 201 sigset_t sigmask; |
| 202 |
| 203 int prev_var = test_var; |
| 204 sd = socket(AF_INET, SOCK_STREAM, 0); |
| 205 assert(sd == 51); |
| 206 assert(test_var - prev_var == 1); |
| 207 |
| 208 memset(&s_in, 0, sizeof(s_in)); |
| 209 s_in.sin_family = AF_INET; |
| 210 s_in.sin_addr.s_addr = INADDR_ANY; |
| 211 s_in.sin_port = htons(PORT); |
| 212 |
| 213 prev_var = test_var; |
| 214 ret = bind(sd, (struct sockaddr *) &s_in, sizeof(s_in)); |
| 215 assert(ret == 0); |
| 216 assert(test_var - prev_var == 1); |
| 217 |
| 218 prev_var = test_var; |
| 219 errno = 0; |
| 220 bind(-1, (struct sockaddr *) &s_in, sizeof(s_in)); |
| 221 ret = errno; |
| 222 assert(ret == -53); |
| 223 assert(test_var - prev_var == 1); |
| 224 |
| 225 prev_var = test_var; |
| 226 ret = listen(-1, 5); |
| 227 assert(errno == -54); |
| 228 assert(test_var - prev_var == 1); |
| 229 |
| 230 addrlen = sizeof(pin); |
| 231 prev_var = test_var; |
| 232 sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen); |
| 233 assert(addrlen == 52 && sd_current == 23); |
| 234 assert(test_var - prev_var == 1); |
| 235 |
| 236 prev_var = test_var; |
| 237 errno = 0; |
| 238 connect(sd_current, &s_in, addrlen); |
| 239 ret = errno; |
| 240 assert(ret == 0); |
| 241 assert(test_var - prev_var == 1); |
| 242 |
| 243 prev_var = test_var; |
| 244 ret = recv(sd_current, dir, sizeof(dir), 0); |
| 245 assert(ret == 59); |
| 246 assert(test_var - prev_var == 1); |
| 247 |
| 248 prev_var = test_var; |
| 249 ret = send(sd_current, dir, sizeof(dir), 0); |
| 250 assert(ret == 56); |
| 251 assert(test_var - prev_var == 1); |
| 252 |
| 253 prev_var = test_var; |
| 254 ret = sendto(sd_current, dir, sizeof(dir), 0, &s_in, 0); |
| 255 assert(ret == 57); |
| 256 assert(test_var - prev_var == 1); |
| 257 |
| 258 prev_var = test_var; |
| 259 ret = recvfrom(sd_current, dir, sizeof(dir), 0, &s_in, &addrlen); |
| 260 assert(ret == 60); |
| 261 assert(test_var - prev_var == 1); |
| 262 |
| 263 prev_var = test_var; |
| 264 ret = recvmsg(sd_current, &msg, 0); |
| 265 assert(ret == 61); |
| 266 assert(test_var - prev_var == 1); |
| 267 |
| 268 prev_var = test_var; |
| 269 ret = sendmsg(sd_current, &msg, 0); |
| 270 assert(ret == 58); |
| 271 assert(test_var - prev_var == 1); |
| 272 |
| 273 prev_var = test_var; |
| 274 errno = 0; |
| 275 getsockopt(sd, 0, 0, dir, &addrlen); |
| 276 ret = errno; |
| 277 assert(ret == -65); |
| 278 assert(test_var - prev_var == 1); |
| 279 |
| 280 prev_var = test_var; |
| 281 errno = 0; |
| 282 setsockopt(sd, 0, 0, dir, addrlen); |
| 283 ret = errno; |
| 284 assert(ret == -64); |
| 285 assert(test_var - prev_var == 1); |
| 286 |
| 287 prev_var = test_var; |
| 288 getpeername(sd, &s_in, &addrlen); |
| 289 assert(addrlen == 63); |
| 290 assert(test_var - prev_var == 1); |
| 291 |
| 292 prev_var = test_var; |
| 293 getsockname(sd, &s_in, &addrlen); |
| 294 assert(addrlen == 62); |
| 295 assert(test_var - prev_var == 1); |
| 296 |
| 297 prev_var = test_var; |
| 298 errno = 0; |
| 299 epoll_create(0); |
| 300 ret = errno; |
| 301 assert(ret == -66); |
| 302 assert(test_var - prev_var == 1); |
| 303 |
| 304 prev_var = test_var; |
| 305 errno = 0; |
| 306 epoll_ctl(0, 0, 0, &event); |
| 307 ret = errno; |
| 308 assert(ret == -67); |
| 309 assert(test_var - prev_var == 1); |
| 310 |
| 311 prev_var = test_var; |
| 312 errno = 0; |
| 313 epoll_wait(0, &event, 0, 0); |
| 314 ret = errno; |
| 315 assert(ret == -68); |
| 316 assert(test_var - prev_var == 1); |
| 317 |
| 318 prev_var = test_var; |
| 319 errno = 0; |
| 320 epoll_pwait(0, &event, 0, 0, &sigmask); |
| 321 ret = errno; |
| 322 assert(ret == -69); |
| 323 assert(test_var - prev_var == 1); |
| 324 |
| 325 prev_var = test_var; |
| 326 errno = 0; |
| 327 poll(&pollfds, 0, 0); |
| 328 ret = errno; |
| 329 assert(ret == -70); |
| 330 assert(test_var - prev_var == 1); |
| 331 |
| 332 prev_var = test_var; |
| 333 errno = 0; |
| 334 ppoll(&pollfds, 0, &timeout, &sigmask); |
| 335 ret = errno; |
| 336 assert(ret == -71); |
| 337 assert(test_var - prev_var == 1); |
| 338 |
| 339 return 0; |
| 340 } |
| 341 |
OLD | NEW |