socket_test.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <arpa/inet.h> 6#include <errno.h> 7#include <fcntl.h> 8#include <netinet/in.h> 9#include <pthread.h> 10#include <sys/types.h> 11#include <sys/socket.h> 12#include <sys/stat.h> 13 14#include <map> 15#include <string> 16 17#include "gmock/gmock.h" 18#include "gtest/gtest.h" 19 20#include "nacl_io/kernel_intercept.h" 21#include "nacl_io/kernel_proxy.h" 22#include "nacl_io/ossocket.h" 23#include "nacl_io/ostypes.h" 24 25#ifdef PROVIDES_SOCKET_API 26 27using namespace nacl_io; 28using namespace sdk_util; 29 30namespace { 31class SocketTest : public ::testing::Test { 32 public: 33 SocketTest() {} 34 35 void SetUp() { 36 ki_init(&kp_); 37 } 38 39 void TearDown() { 40 ki_uninit(); 41 } 42 43 protected: 44 KernelProxy kp_; 45}; 46 47} // namespace 48 49TEST_F(SocketTest, Accept) { 50 struct sockaddr addr = {}; 51 socklen_t len = 0; 52 53 EXPECT_LT(ki_accept(123, NULL, &len), 0); 54 EXPECT_EQ(errno, EFAULT); 55 EXPECT_LT(ki_accept(123, &addr, NULL), 0); 56 EXPECT_EQ(errno, EFAULT); 57 EXPECT_LT(ki_accept(123, NULL, NULL), 0); 58 EXPECT_EQ(errno, EFAULT); 59 EXPECT_LT(ki_accept(-1, &addr, &len), 0); 60 EXPECT_EQ(errno, EBADF); 61 EXPECT_LT(ki_accept(0, &addr, &len), 0); 62 EXPECT_EQ(errno, ENOTSOCK); 63} 64 65TEST_F(SocketTest, Bind) { 66 const struct sockaddr const_addr = {}; 67 socklen_t len = 0; 68 69 EXPECT_LT(ki_bind(123, NULL, len), 0); 70 EXPECT_EQ(errno, EFAULT); 71 EXPECT_LT(ki_bind(-1, &const_addr, len), 0); 72 EXPECT_EQ(errno, EBADF); 73 EXPECT_LT(ki_bind(0, &const_addr, len), 0); 74 EXPECT_EQ(errno, ENOTSOCK); 75} 76 77TEST_F(SocketTest, Connect) { 78 const struct sockaddr const_addr = {}; 79 socklen_t len = 0; 80 81 EXPECT_LT(ki_connect(123, NULL, len), 0); 82 EXPECT_EQ(errno, EFAULT); 83 EXPECT_LT(ki_connect(-1, &const_addr, len), 0); 84 EXPECT_EQ(errno, EBADF); 85 EXPECT_LT(ki_connect(0, &const_addr, len), 0); 86 EXPECT_EQ(errno, ENOTSOCK); 87} 88 89TEST_F(SocketTest, Getpeername) { 90 struct sockaddr addr = {}; 91 socklen_t len = 0; 92 93 EXPECT_LT(ki_getpeername(123, NULL, &len), 0); 94 EXPECT_EQ(errno, EFAULT); 95 EXPECT_LT(ki_getpeername(123, &addr, NULL), 0); 96 EXPECT_EQ(errno, EFAULT); 97 EXPECT_LT(ki_getpeername(123, NULL, NULL), 0); 98 EXPECT_EQ(errno, EFAULT); 99 EXPECT_LT(ki_getpeername(-1, &addr, &len), 0); 100 EXPECT_EQ(errno, EBADF); 101 EXPECT_LT(ki_getpeername(0, &addr, &len), 0); 102 EXPECT_EQ(errno, ENOTSOCK); 103} 104 105TEST_F(SocketTest, Getsockname) { 106 struct sockaddr addr = {}; 107 socklen_t len = 0; 108 109 EXPECT_LT(ki_getsockname(123, NULL, &len), 0); 110 EXPECT_EQ(errno, EFAULT); 111 EXPECT_LT(ki_getsockname(123, &addr, NULL), 0); 112 EXPECT_EQ(errno, EFAULT); 113 EXPECT_LT(ki_getsockname(123, NULL, NULL), 0); 114 EXPECT_EQ(errno, EFAULT); 115 EXPECT_LT(ki_getsockname(-1, &addr, &len), 0); 116 EXPECT_EQ(errno, EBADF); 117 EXPECT_LT(ki_getsockname(0, &addr, &len), 0); 118 EXPECT_EQ(errno, ENOTSOCK); 119} 120 121TEST_F(SocketTest, Getsockopt) { 122 socklen_t len = 10; 123 char optval[len]; 124 125 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, optval, NULL), 0); 126 EXPECT_EQ(errno, EFAULT); 127 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, &len), 0); 128 EXPECT_EQ(errno, EFAULT); 129 EXPECT_LT(ki_getsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, NULL), 0); 130 EXPECT_EQ(errno, EFAULT); 131 EXPECT_LT(ki_getsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0); 132 EXPECT_EQ(errno, EBADF); 133 EXPECT_LT(ki_getsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, &len), 0); 134 EXPECT_EQ(errno, ENOTSOCK); 135} 136 137TEST_F(SocketTest, Listen) { 138 EXPECT_LT(ki_listen(-1, 123), 0); 139 EXPECT_EQ(errno, EBADF); 140 EXPECT_LT(ki_listen(0, 123), 0); 141 EXPECT_EQ(errno, ENOTSOCK); 142} 143 144TEST_F(SocketTest, Recv) { 145 size_t len = 10; 146 char buf[len]; 147 148 EXPECT_LT(ki_recv(123, NULL, len, 0), 0); 149 EXPECT_EQ(errno, EFAULT); 150 EXPECT_LT(ki_recv(-1, buf, len, 0), 0); 151 EXPECT_EQ(errno, EBADF); 152 EXPECT_LT(ki_recv(0, buf, len, 0), 0); 153 EXPECT_EQ(errno, ENOTSOCK); 154} 155 156TEST_F(SocketTest, Recvfrom) { 157 size_t len = 10; 158 char buf[len]; 159 struct sockaddr addr = {}; 160 socklen_t addrlen = 4; 161 162 EXPECT_LT(ki_recvfrom(123, NULL, len, 0, &addr, &addrlen), 0); 163 EXPECT_EQ(errno, EFAULT); 164 EXPECT_LT(ki_recvfrom(123, buf, len, 0, &addr, NULL), 0); 165 EXPECT_EQ(errno, EFAULT); 166 EXPECT_LT(ki_recvfrom(-1, buf, len, 0, &addr, &addrlen), 0); 167 EXPECT_EQ(errno, EBADF); 168 EXPECT_LT(ki_recvfrom(0, buf, len, 0, &addr, &addrlen), 0); 169 EXPECT_EQ(errno, ENOTSOCK); 170} 171 172TEST_F(SocketTest, Recvmsg) { 173 struct msghdr msg = {}; 174 175 EXPECT_LT(ki_recvmsg(123, NULL, 0), 0); 176 EXPECT_EQ(errno, EFAULT); 177 EXPECT_LT(ki_recvmsg(-1, &msg, 0), 0); 178 EXPECT_EQ(errno, EBADF); 179 EXPECT_LT(ki_recvmsg(0, &msg, 0), 0); 180 EXPECT_EQ(errno, ENOTSOCK); 181} 182 183TEST_F(SocketTest, Send) { 184 size_t len = 10; 185 char buf[len]; 186 187 EXPECT_LT(ki_send(123, NULL, len, 0), 0); 188 EXPECT_EQ(errno, EFAULT); 189 EXPECT_LT(ki_send(-1, buf, len, 0), 0); 190 EXPECT_EQ(errno, EBADF); 191 EXPECT_LT(ki_send(0, buf, len, 0), 0); 192 EXPECT_EQ(errno, ENOTSOCK); 193} 194 195TEST_F(SocketTest, Sendto) { 196 size_t len = 10; 197 char buf[len]; 198 struct sockaddr addr = {}; 199 socklen_t addrlen = 4; 200 201 EXPECT_LT(ki_sendto(123, NULL, len, 0, &addr, addrlen), 0); 202 EXPECT_EQ(errno, EFAULT); 203 EXPECT_LT(ki_sendto(-1, buf, len, 0, &addr, addrlen), 0); 204 EXPECT_EQ(errno, EBADF); 205 EXPECT_LT(ki_sendto(0, buf, len, 0, &addr, addrlen), 0); 206 EXPECT_EQ(errno, ENOTSOCK); 207} 208 209TEST_F(SocketTest, Sendmsg) { 210 struct msghdr msg = {}; 211 212 EXPECT_LT(ki_sendmsg(123, NULL, 0), 0); 213 EXPECT_EQ(errno, EFAULT); 214 EXPECT_LT(ki_sendmsg(-1, &msg, 0), 0); 215 EXPECT_EQ(errno, EBADF); 216 EXPECT_LT(ki_sendmsg(0, &msg, 0), 0); 217 EXPECT_EQ(errno, ENOTSOCK); 218} 219 220TEST_F(SocketTest, Setsockopt) { 221 socklen_t len = 10; 222 char optval[len]; 223 224 // Passing a bad address as optval should generate EFAULT 225 EXPECT_EQ(-1, ki_setsockopt(123, SOL_SOCKET, SO_ACCEPTCONN, NULL, len)); 226 EXPECT_EQ(errno, EFAULT); 227 228 // Passing a bad socket descriptor should generate EBADF 229 EXPECT_EQ(-1, ki_setsockopt(-1, SOL_SOCKET, SO_ACCEPTCONN, optval, len)); 230 EXPECT_EQ(errno, EBADF); 231 232 // Passing an FD that is valid but not a socket should generate ENOTSOCK 233 EXPECT_EQ(-1, ki_setsockopt(0, SOL_SOCKET, SO_ACCEPTCONN, optval, len)); 234 EXPECT_EQ(errno, ENOTSOCK); 235} 236 237TEST_F(SocketTest, Shutdown) { 238 EXPECT_LT(ki_shutdown(-1, SHUT_RDWR), 0); 239 EXPECT_EQ(errno, EBADF); 240 EXPECT_LT(ki_shutdown(0, SHUT_RDWR), 0); 241 EXPECT_EQ(errno, ENOTSOCK); 242} 243 244TEST_F(SocketTest, Socket) { 245 EXPECT_LT(ki_socket(AF_UNIX, SOCK_STREAM, 0), 0); 246 EXPECT_EQ(errno, EAFNOSUPPORT); 247 EXPECT_LT(ki_socket(AF_INET, SOCK_RAW, 0), 0); 248 EXPECT_EQ(errno, EPROTONOSUPPORT); 249} 250 251TEST_F(SocketTest, Socketpair) { 252 int sv[2]; 253 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, NULL), 0); 254 EXPECT_EQ(errno, EFAULT); 255 EXPECT_LT(ki_socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0); 256 EXPECT_EQ(errno, EAFNOSUPPORT); 257 EXPECT_LT(ki_socketpair(AF_INET, SOCK_STREAM, 0, sv), 0); 258 EXPECT_EQ(errno, EPROTONOSUPPORT); 259 EXPECT_LT(ki_socketpair(AF_INET6, SOCK_STREAM, 0, sv), 0); 260 EXPECT_EQ(errno, EPROTONOSUPPORT); 261} 262 263// These utility functions are only used for newlib (glibc provides its own 264// implementations of these functions). 265#if !defined(__GLIBC__) 266 267TEST(SocketUtilityFunctions, Hstrerror) { 268 EXPECT_STREQ(hstrerror(2718), 269 "Unknown error in gethostbyname: 2718."); 270} 271 272TEST(SocketUtilityFunctions, Htonl) { 273 uint32_t host_long = 0x44332211; 274 uint32_t network_long = htonl(host_long); 275 uint8_t network_bytes[4]; 276 memcpy(network_bytes, &network_long, 4); 277 EXPECT_EQ(network_bytes[0], 0x44); 278 EXPECT_EQ(network_bytes[1], 0x33); 279 EXPECT_EQ(network_bytes[2], 0x22); 280 EXPECT_EQ(network_bytes[3], 0x11); 281} 282 283TEST(SocketUtilityFunctions, Htons) { 284 uint16_t host_short = 0x2211; 285 uint16_t network_short = htons(host_short); 286 uint8_t network_bytes[2]; 287 memcpy(network_bytes, &network_short, 2); 288 EXPECT_EQ(network_bytes[0], 0x22); 289 EXPECT_EQ(network_bytes[1], 0x11); 290} 291 292static struct in_addr generate_ipv4_addr(int tuple1, int tuple2, 293 int tuple3, int tuple4) { 294 unsigned char addr[4]; 295 addr[0] = static_cast<unsigned char>(tuple1); 296 addr[1] = static_cast<unsigned char>(tuple2); 297 addr[2] = static_cast<unsigned char>(tuple3); 298 addr[3] = static_cast<unsigned char>(tuple4); 299 struct in_addr real_addr; 300 memcpy(&real_addr, addr, 4); 301 return real_addr; 302} 303 304static struct in6_addr generate_ipv6_addr(int* tuples) { 305 unsigned char addr[16]; 306 for (int i = 0; i < 8; i++) { 307 addr[2*i] = (tuples[i] >> 8) & 0xFF; 308 addr[2*i+1] = tuples[i] & 0xFF; 309 } 310 struct in6_addr real_addr; 311 memcpy(&real_addr, addr, 16); 312 return real_addr; 313} 314 315TEST(SocketUtilityFunctions, Inet_ntoa) { 316 char* stringified_addr = inet_ntoa(generate_ipv4_addr(0,0,0,0)); 317 ASSERT_TRUE(NULL != stringified_addr); 318 EXPECT_STREQ("0.0.0.0", stringified_addr); 319 320 stringified_addr = inet_ntoa(generate_ipv4_addr(127,0,0,1)); 321 ASSERT_TRUE(NULL != stringified_addr); 322 EXPECT_STREQ("127.0.0.1", stringified_addr); 323 324 stringified_addr = inet_ntoa(generate_ipv4_addr(255,255,255,255)); 325 ASSERT_TRUE(NULL != stringified_addr); 326 EXPECT_STREQ("255.255.255.255", stringified_addr); 327} 328 329TEST(SocketUtilityFunctions, Inet_ntop_ipv4) { 330 char stringified_addr[INET_ADDRSTRLEN]; 331 332 struct in_addr real_addr = generate_ipv4_addr(0,0,0,0); 333 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, 334 stringified_addr, INET_ADDRSTRLEN)); 335 EXPECT_STREQ("0.0.0.0", stringified_addr); 336 337 real_addr = generate_ipv4_addr(127,0,0,1); 338 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, 339 stringified_addr, INET_ADDRSTRLEN)); 340 EXPECT_STREQ("127.0.0.1", stringified_addr); 341 342 real_addr = generate_ipv4_addr(255,255,255,255); 343 EXPECT_TRUE(NULL != inet_ntop(AF_INET, &real_addr, 344 stringified_addr, INET_ADDRSTRLEN)); 345 EXPECT_STREQ("255.255.255.255", stringified_addr); 346} 347 348TEST(SocketUtilityFunctions, Inet_ntop_ipv6) { 349 char stringified_addr[INET6_ADDRSTRLEN]; 350 351 { 352 int addr_tuples[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 353 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); 354 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, 355 stringified_addr, INET6_ADDRSTRLEN)); 356 EXPECT_STREQ("0:0:0:0:0:0:0:0", stringified_addr); 357 } 358 359 { 360 int addr_tuples[8] = { 0x1234, 0xa, 0x12, 0x0000, 361 0x5678, 0x9abc, 0xdef, 0xffff }; 362 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); 363 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, 364 stringified_addr, INET6_ADDRSTRLEN)); 365 EXPECT_STREQ("1234:a:12:0:5678:9abc:def:ffff", stringified_addr); 366 } 367 368 { 369 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff, 370 0xffff, 0xffff, 0xffff, 0xffff }; 371 struct in6_addr real_addr = generate_ipv6_addr(addr_tuples); 372 EXPECT_TRUE(NULL != inet_ntop(AF_INET6, &real_addr, 373 stringified_addr, INET6_ADDRSTRLEN)); 374 EXPECT_STREQ("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", stringified_addr); 375 } 376} 377 378TEST(SocketUtilityFunctions, Inet_ntop_failure) { 379 char addr_name[INET6_ADDRSTRLEN]; 380 int addr_tuples[8] = { 0xffff, 0xffff, 0xffff, 0xffff, 381 0xffff, 0xffff, 0xffff, 0xffff }; 382 struct in6_addr ipv6_addr = generate_ipv6_addr(addr_tuples); 383 struct in_addr ipv4_addr = generate_ipv4_addr(255,255,255,255); 384 385 EXPECT_TRUE(NULL == inet_ntop(AF_UNIX, &ipv6_addr, 386 addr_name, INET6_ADDRSTRLEN)); 387 EXPECT_EQ(errno, EAFNOSUPPORT); 388 389 EXPECT_TRUE(NULL == inet_ntop(AF_INET, &ipv4_addr, 390 addr_name, INET_ADDRSTRLEN - 1)); 391 EXPECT_EQ(errno, ENOSPC); 392 393 EXPECT_TRUE(NULL == inet_ntop(AF_INET6, &ipv6_addr, 394 addr_name, INET6_ADDRSTRLEN - 1)); 395 EXPECT_EQ(errno, ENOSPC); 396} 397 398TEST(SocketUtilityFunctions, Inet_ptoa) { 399 struct { 400 int family; 401 const char* input; 402 const char* output; 403 } tests[] = { 404 { AF_INET, "127.127.12.0", NULL }, 405 { AF_INET, "0.0.0.0", NULL }, 406 407 { AF_INET6, "0:0:0:0:0:0:0:0", NULL }, 408 { AF_INET6, "1234:5678:9abc:def0:1234:5678:9abc:def0", NULL }, 409 { AF_INET6, "1:2:3:4:5:6:7:8", NULL }, 410 { AF_INET6, "a:b:c:d:e:f:1:2", NULL }, 411 { AF_INET6, "A:B:C:D:E:F:1:2", "a:b:c:d:e:f:1:2" }, 412 { AF_INET6, "::", "0:0:0:0:0:0:0:0" }, 413 { AF_INET6, "::12", "0:0:0:0:0:0:0:12" }, 414 { AF_INET6, "::1:2:3", "0:0:0:0:0:1:2:3" }, 415 { AF_INET6, "12::", "12:0:0:0:0:0:0:0" }, 416 { AF_INET6, "1:2::", "1:2:0:0:0:0:0:0" }, 417 { AF_INET6, "::12:0:0:0:0:0:0:0", "12:0:0:0:0:0:0:0" }, 418 { AF_INET6, "1:2:3::4:5", "1:2:3:0:0:0:4:5" }, 419 { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" }, 420 { AF_INET6, "::ffff:1.1.1.1", "0:0:0:0:0:ffff:101:101" }, 421 { AF_INET6, "ffff::1.1.1.1", "ffff:0:0:0:0:0:101:101" }, 422 { AF_INET6, "::1.1.1.1", "0:0:0:0:0:0:101:101" }, 423 }; 424 425 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { 426 uint8_t addr[16]; 427 EXPECT_TRUE(inet_pton(tests[i].family, tests[i].input, addr)); 428 const char* expected = tests[i].output ? tests[i].output : tests[i].input; 429 char out_buffer[256]; 430 EXPECT_TRUE( 431 inet_ntop(tests[i].family, addr, out_buffer, sizeof(out_buffer))); 432 EXPECT_EQ(std::string(expected), std::string(out_buffer)); 433 } 434} 435 436TEST(SocketUtilityFunctions, Inet_ptoa_failure) { 437 uint8_t addr[16]; 438 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24312", &addr)); 439 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.24 ", &addr)); 440 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.1", &addr)); 441 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12. 0", &addr)); 442 EXPECT_EQ(0, inet_pton(AF_INET, " 127.127.12.0", &addr)); 443 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0.", &addr)); 444 EXPECT_EQ(0, inet_pton(AF_INET, ".127.127.12.0", &addr)); 445 EXPECT_EQ(0, inet_pton(AF_INET, "127.127.12.0x0", &addr)); 446 447 EXPECT_EQ(0, inet_pton(AF_INET6, ":::", &addr)); 448 EXPECT_EQ(0, inet_pton(AF_INET6, "0:::0", &addr)); 449 EXPECT_EQ(0, inet_pton(AF_INET6, "0::0:0::1", &addr)); 450 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1: 2", &addr)); 451 EXPECT_EQ(0, inet_pton(AF_INET6, " 0:0:0:0:0:0:1:2", &addr)); 452 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2 ", &addr)); 453 EXPECT_EQ(0, inet_pton(AF_INET6, ":0:0:0:0:0:0:1:2", &addr)); 454 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:2:4", &addr)); 455 EXPECT_EQ(0, inet_pton(AF_INET6, "0:0:0:0:0:0:1:0.0.0.0", &addr)); 456 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0:1", &addr)); 457 EXPECT_EQ(0, inet_pton(AF_INET6, "::0.0.0.0.0", &addr)); 458} 459 460TEST(SocketUtilityFunctions, Ntohs) { 461 uint8_t network_bytes[2] = { 0x22, 0x11 }; 462 uint16_t network_short; 463 memcpy(&network_short, network_bytes, 2); 464 uint16_t host_short = ntohs(network_short); 465 EXPECT_EQ(host_short, 0x2211); 466} 467 468TEST(SocketUtilityFunctions, Ntohl) { 469 uint8_t network_bytes[4] = { 0x44, 0x33, 0x22, 0x11 }; 470 uint32_t network_long; 471 memcpy(&network_long, network_bytes, 4); 472 uint32_t host_long = ntohl(network_long); 473 EXPECT_EQ(host_long, 0x44332211); 474} 475 476#endif // !defined(__GLIBC__) 477#endif // PROVIDES_SOCKETPAIR_API 478