test_address.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. /* Copyright (c) 2014-2015, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define ADDRESS_PRIVATE
  4. #include "orconfig.h"
  5. #ifdef _WIN32
  6. #include <winsock2.h>
  7. /* For access to structs needed by GetAdaptersAddresses */
  8. #include <iphlpapi.h>
  9. #endif
  10. #ifdef HAVE_IFADDRS_TO_SMARTLIST
  11. #include <net/if.h>
  12. #include <ifaddrs.h>
  13. #endif
  14. #ifdef HAVE_IFCONF_TO_SMARTLIST
  15. #ifdef HAVE_SYS_IOCTL_H
  16. #include <sys/ioctl.h>
  17. #endif
  18. #include <net/if.h>
  19. #endif
  20. #include "or.h"
  21. #include "address.h"
  22. #include "test.h"
  23. /** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent
  24. * the same IP address and port combination. Otherwise, return 0.
  25. */
  26. static uint8_t
  27. sockaddr_in_are_equal(struct sockaddr_in *sockaddr1,
  28. struct sockaddr_in *sockaddr2)
  29. {
  30. return ((sockaddr1->sin_family == sockaddr2->sin_family) &&
  31. (sockaddr1->sin_port == sockaddr2->sin_port) &&
  32. (sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr));
  33. }
  34. /** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent
  35. * the same IP address and port combination. Otherwise, return 0.
  36. */
  37. static uint8_t
  38. sockaddr_in6_are_equal(struct sockaddr_in6 *sockaddr1,
  39. struct sockaddr_in6 *sockaddr2)
  40. {
  41. return ((sockaddr1->sin6_family == sockaddr2->sin6_family) &&
  42. (sockaddr1->sin6_port == sockaddr2->sin6_port) &&
  43. (tor_memeq(sockaddr1->sin6_addr.s6_addr,
  44. sockaddr2->sin6_addr.s6_addr,16)));
  45. }
  46. /** Create a sockaddr_in structure from IP address string <b>ip_str</b>.
  47. *
  48. * If <b>out</b> is not NULL, write the result
  49. * to the memory address in <b>out</b>. Otherwise, allocate the memory
  50. * for result. On success, return pointer to result. Otherwise, return
  51. * NULL.
  52. */
  53. static struct sockaddr_in *
  54. sockaddr_in_from_string(const char *ip_str, struct sockaddr_in *out)
  55. {
  56. // [FIXME: add some error checking?]
  57. if (!out)
  58. out = tor_malloc_zero(sizeof(struct sockaddr_in));
  59. out->sin_family = AF_INET;
  60. out->sin_port = 0;
  61. tor_inet_pton(AF_INET,ip_str,&(out->sin_addr));
  62. return out;
  63. }
  64. /** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
  65. * that is an IPv4 or IPv6 localhost address. Otherwise, return 0.
  66. */
  67. static int
  68. smartlist_contains_localhost_tor_addr(smartlist_t *smartlist)
  69. {
  70. SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
  71. if (tor_addr_is_loopback(tor_addr)) {
  72. return 1;
  73. }
  74. } SMARTLIST_FOREACH_END(tor_addr);
  75. return 0;
  76. }
  77. /** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
  78. * that is an IPv4 or IPv6 multicast address. Otherwise, return 0.
  79. */
  80. static int
  81. smartlist_contains_multicast_tor_addr(smartlist_t *smartlist)
  82. {
  83. SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
  84. if (tor_addr_is_multicast(tor_addr)) {
  85. return 1;
  86. }
  87. } SMARTLIST_FOREACH_END(tor_addr);
  88. return 0;
  89. }
  90. /** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
  91. * that is an IPv4 or IPv6 internal address. Otherwise, return 0.
  92. */
  93. static int
  94. smartlist_contains_internal_tor_addr(smartlist_t *smartlist)
  95. {
  96. SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
  97. if (tor_addr_is_internal(tor_addr, 0)) {
  98. return 1;
  99. }
  100. } SMARTLIST_FOREACH_END(tor_addr);
  101. return 0;
  102. }
  103. /** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
  104. * that is an IPv4 address. Otherwise, return 0.
  105. */
  106. static int
  107. smartlist_contains_ipv4_tor_addr(smartlist_t *smartlist)
  108. {
  109. SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
  110. if (tor_addr_is_v4(tor_addr)) {
  111. return 1;
  112. }
  113. } SMARTLIST_FOREACH_END(tor_addr);
  114. return 0;
  115. }
  116. /** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
  117. * that is an IPv6 address. Otherwise, return 0.
  118. */
  119. static int
  120. smartlist_contains_ipv6_tor_addr(smartlist_t *smartlist)
  121. {
  122. SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
  123. /* Since there's no tor_addr_is_v6, assume all non-v4s are v6 */
  124. if (!tor_addr_is_v4(tor_addr)) {
  125. return 1;
  126. }
  127. } SMARTLIST_FOREACH_END(tor_addr);
  128. return 0;
  129. }
  130. #ifdef HAVE_IFADDRS_TO_SMARTLIST
  131. static void
  132. test_address_ifaddrs_to_smartlist(void *arg)
  133. {
  134. struct ifaddrs *ifa = NULL;
  135. struct ifaddrs *ifa_ipv4 = NULL;
  136. struct ifaddrs *ifa_ipv6 = NULL;
  137. struct sockaddr_in *ipv4_sockaddr_local = NULL;
  138. struct sockaddr_in *netmask_slash8 = NULL;
  139. struct sockaddr_in *ipv4_sockaddr_remote = NULL;
  140. struct sockaddr_in6 *ipv6_sockaddr = NULL;
  141. smartlist_t *smartlist = NULL;
  142. tor_addr_t *tor_addr = NULL;
  143. struct sockaddr *sockaddr_to_check = NULL;
  144. socklen_t addr_len;
  145. (void)arg;
  146. netmask_slash8 = sockaddr_in_from_string("255.0.0.0",NULL);
  147. ipv4_sockaddr_local = sockaddr_in_from_string("127.0.0.1",NULL);
  148. ipv4_sockaddr_remote = sockaddr_in_from_string("128.52.160.20",NULL);
  149. ipv6_sockaddr = tor_malloc(sizeof(struct sockaddr_in6));
  150. ipv6_sockaddr->sin6_family = AF_INET6;
  151. ipv6_sockaddr->sin6_port = 0;
  152. tor_inet_pton(AF_INET6, "2001:db8:8714:3a90::12",
  153. &(ipv6_sockaddr->sin6_addr));
  154. ifa = tor_malloc(sizeof(struct ifaddrs));
  155. ifa_ipv4 = tor_malloc(sizeof(struct ifaddrs));
  156. ifa_ipv6 = tor_malloc(sizeof(struct ifaddrs));
  157. ifa->ifa_next = ifa_ipv4;
  158. ifa->ifa_name = tor_strdup("eth0");
  159. ifa->ifa_flags = IFF_UP | IFF_RUNNING;
  160. ifa->ifa_addr = (struct sockaddr *)ipv4_sockaddr_local;
  161. ifa->ifa_netmask = (struct sockaddr *)netmask_slash8;
  162. ifa->ifa_dstaddr = NULL;
  163. ifa->ifa_data = NULL;
  164. ifa_ipv4->ifa_next = ifa_ipv6;
  165. ifa_ipv4->ifa_name = tor_strdup("eth1");
  166. ifa_ipv4->ifa_flags = IFF_UP | IFF_RUNNING;
  167. ifa_ipv4->ifa_addr = (struct sockaddr *)ipv4_sockaddr_remote;
  168. ifa_ipv4->ifa_netmask = (struct sockaddr *)netmask_slash8;
  169. ifa_ipv4->ifa_dstaddr = NULL;
  170. ifa_ipv4->ifa_data = NULL;
  171. ifa_ipv6->ifa_next = NULL;
  172. ifa_ipv6->ifa_name = tor_strdup("eth2");
  173. ifa_ipv6->ifa_flags = IFF_UP | IFF_RUNNING;
  174. ifa_ipv6->ifa_addr = (struct sockaddr *)ipv6_sockaddr;
  175. ifa_ipv6->ifa_netmask = NULL;
  176. ifa_ipv6->ifa_dstaddr = NULL;
  177. ifa_ipv6->ifa_data = NULL;
  178. smartlist = ifaddrs_to_smartlist(ifa);
  179. tt_assert(smartlist);
  180. tt_assert(smartlist_len(smartlist) == 3);
  181. sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6));
  182. tor_addr = smartlist_get(smartlist,0);
  183. addr_len =
  184. tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
  185. sizeof(struct sockaddr_in));
  186. tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
  187. tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
  188. ipv4_sockaddr_local));
  189. tor_addr = smartlist_get(smartlist,1);
  190. addr_len =
  191. tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
  192. sizeof(struct sockaddr_in));
  193. tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
  194. tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
  195. ipv4_sockaddr_remote));
  196. tor_addr = smartlist_get(smartlist,2);
  197. addr_len =
  198. tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
  199. sizeof(struct sockaddr_in6));
  200. tt_int_op(addr_len,==,sizeof(struct sockaddr_in6));
  201. tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check,
  202. ipv6_sockaddr));
  203. done:
  204. tor_free(netmask_slash8);
  205. tor_free(ipv4_sockaddr_local);
  206. tor_free(ipv4_sockaddr_remote);
  207. tor_free(ipv6_sockaddr);
  208. tor_free(ifa->ifa_name);
  209. tor_free(ifa_ipv4->ifa_name);
  210. tor_free(ifa_ipv6->ifa_name);
  211. tor_free(ifa);
  212. tor_free(ifa_ipv4);
  213. tor_free(ifa_ipv6);
  214. tor_free(sockaddr_to_check);
  215. if (smartlist) {
  216. SMARTLIST_FOREACH(smartlist, tor_addr_t *, t, tor_free(t));
  217. smartlist_free(smartlist);
  218. }
  219. return;
  220. }
  221. static void
  222. test_address_get_if_addrs_ifaddrs(void *arg)
  223. {
  224. smartlist_t *results = NULL;
  225. (void)arg;
  226. results = get_interface_addresses_ifaddrs(LOG_ERR);
  227. tt_int_op(smartlist_len(results),>=,1);
  228. #ifndef __FreeBSD__
  229. /* FreeBSD doesn't have a localhost in jails sometimes. */
  230. tt_assert(smartlist_contains_localhost_tor_addr(results));
  231. #endif
  232. done:
  233. SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
  234. smartlist_free(results);
  235. return;
  236. }
  237. #endif
  238. #ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
  239. static void
  240. test_address_get_if_addrs_win32(void *arg)
  241. {
  242. smartlist_t *results = NULL;
  243. (void)arg;
  244. results = get_interface_addresses_win32(LOG_ERR);
  245. tt_int_op(smartlist_len(results),>=,1);
  246. tt_assert(smartlist_contains_localhost_tor_addr(results));
  247. done:
  248. SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
  249. tor_free(results);
  250. return;
  251. }
  252. static void
  253. test_address_ip_adapter_addresses_to_smartlist(void *arg)
  254. {
  255. IP_ADAPTER_ADDRESSES *addrs1;
  256. IP_ADAPTER_ADDRESSES *addrs2;
  257. IP_ADAPTER_UNICAST_ADDRESS *unicast11;
  258. IP_ADAPTER_UNICAST_ADDRESS *unicast12;
  259. IP_ADAPTER_UNICAST_ADDRESS *unicast21;
  260. smartlist_t *result = NULL;
  261. struct sockaddr_in *sockaddr_test1;
  262. struct sockaddr_in *sockaddr_test2;
  263. struct sockaddr_in *sockaddr_localhost;
  264. struct sockaddr_in *sockaddr_to_check;
  265. tor_addr_t *tor_addr;
  266. (void)arg;
  267. (void)sockaddr_in6_are_equal;
  268. sockaddr_to_check = tor_malloc_zero(sizeof(struct sockaddr_in));
  269. addrs1 =
  270. tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES));
  271. addrs1->FirstUnicastAddress =
  272. unicast11 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
  273. sockaddr_test1 = sockaddr_in_from_string("86.59.30.40",NULL);
  274. unicast11->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test1;
  275. unicast11->Next = unicast12 =
  276. tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
  277. sockaddr_test2 = sockaddr_in_from_string("93.95.227.222", NULL);
  278. unicast12->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test2;
  279. addrs1->Next = addrs2 =
  280. tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES));
  281. addrs2->FirstUnicastAddress =
  282. unicast21 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
  283. sockaddr_localhost = sockaddr_in_from_string("127.0.0.1", NULL);
  284. unicast21->Address.lpSockaddr = (LPSOCKADDR)sockaddr_localhost;
  285. result = ip_adapter_addresses_to_smartlist(addrs1);
  286. tt_assert(result);
  287. tt_assert(smartlist_len(result) == 3);
  288. tor_addr = smartlist_get(result,0);
  289. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  290. sizeof(struct sockaddr_in));
  291. tt_assert(sockaddr_in_are_equal(sockaddr_test1,sockaddr_to_check));
  292. tor_addr = smartlist_get(result,1);
  293. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  294. sizeof(struct sockaddr_in));
  295. tt_assert(sockaddr_in_are_equal(sockaddr_test2,sockaddr_to_check));
  296. tor_addr = smartlist_get(result,2);
  297. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  298. sizeof(struct sockaddr_in));
  299. tt_assert(sockaddr_in_are_equal(sockaddr_localhost,sockaddr_to_check));
  300. done:
  301. SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t));
  302. smartlist_free(result);
  303. tor_free(addrs1);
  304. tor_free(addrs2);
  305. tor_free(unicast11->Address.lpSockaddr);
  306. tor_free(unicast11);
  307. tor_free(unicast12->Address.lpSockaddr);
  308. tor_free(unicast12);
  309. tor_free(unicast21->Address.lpSockaddr);
  310. tor_free(unicast21);
  311. tor_free(sockaddr_to_check);
  312. return;
  313. }
  314. #endif
  315. #ifdef HAVE_IFCONF_TO_SMARTLIST
  316. static void
  317. test_address_ifreq_to_smartlist(void *arg)
  318. {
  319. smartlist_t *results = NULL;
  320. const tor_addr_t *tor_addr = NULL;
  321. struct sockaddr_in *sockaddr = NULL;
  322. struct sockaddr_in *sockaddr_eth1 = NULL;
  323. struct sockaddr_in *sockaddr_to_check = NULL;
  324. struct ifconf *ifc;
  325. struct ifreq *ifr;
  326. struct ifreq *ifr_next;
  327. socklen_t addr_len;
  328. (void)arg;
  329. sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in));
  330. ifr = tor_malloc(sizeof(struct ifreq));
  331. memset(ifr,0,sizeof(struct ifreq));
  332. strlcpy(ifr->ifr_name,"lo",3);
  333. sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr);
  334. sockaddr_in_from_string("127.0.0.1",sockaddr);
  335. ifc = tor_malloc(sizeof(struct ifconf));
  336. memset(ifc,0,sizeof(struct ifconf));
  337. ifc->ifc_len = sizeof(struct ifreq);
  338. ifc->ifc_ifcu.ifcu_req = ifr;
  339. results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len);
  340. tt_int_op(smartlist_len(results),==,1);
  341. tor_addr = smartlist_get(results, 0);
  342. addr_len =
  343. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  344. sizeof(struct sockaddr_in));
  345. tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
  346. tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
  347. ifr = tor_realloc(ifr,2*sizeof(struct ifreq));
  348. ifr_next = ifr+1;
  349. strlcpy(ifr_next->ifr_name,"eth1",5);
  350. ifc->ifc_len = 2*sizeof(struct ifreq);
  351. ifc->ifc_ifcu.ifcu_req = ifr;
  352. sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr);
  353. sockaddr_eth1 = (struct sockaddr_in *) &(ifr_next->ifr_ifru.ifru_addr);
  354. sockaddr_in_from_string("192.168.10.55",sockaddr_eth1);
  355. SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
  356. smartlist_free(results);
  357. results = ifreq_to_smartlist(ifc->ifc_buf,ifc->ifc_len);
  358. tt_int_op(smartlist_len(results),==,2);
  359. tor_addr = smartlist_get(results, 0);
  360. addr_len =
  361. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  362. sizeof(struct sockaddr_in));
  363. tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
  364. tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
  365. tor_addr = smartlist_get(results, 1);
  366. addr_len =
  367. tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
  368. sizeof(struct sockaddr_in));
  369. tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
  370. tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check));
  371. done:
  372. tor_free(sockaddr_to_check);
  373. SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
  374. smartlist_free(results);
  375. tor_free(ifc);
  376. tor_free(ifr);
  377. return;
  378. }
  379. static void
  380. test_address_get_if_addrs_ioctl(void *arg)
  381. {
  382. smartlist_t *result = NULL;
  383. (void)arg;
  384. result = get_interface_addresses_ioctl(LOG_ERR);
  385. tt_assert(result);
  386. tt_int_op(smartlist_len(result),>=,1);
  387. #ifndef __FreeBSD__
  388. /* FreeBSD doesn't have a localhost in jails sometimes. */
  389. tt_assert(smartlist_contains_localhost_tor_addr(result));
  390. #endif
  391. done:
  392. if (result) {
  393. SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t));
  394. smartlist_free(result);
  395. }
  396. return;
  397. }
  398. #endif
  399. #define FAKE_SOCKET_FD (42)
  400. static tor_socket_t
  401. fake_open_socket(int domain, int type, int protocol)
  402. {
  403. (void)domain;
  404. (void)type;
  405. (void)protocol;
  406. return FAKE_SOCKET_FD;
  407. }
  408. static int last_connected_socket_fd = 0;
  409. static int connect_retval = 0;
  410. static tor_socket_t
  411. pretend_to_connect(tor_socket_t socket, const struct sockaddr *address,
  412. socklen_t address_len)
  413. {
  414. (void)address;
  415. (void)address_len;
  416. last_connected_socket_fd = socket;
  417. return connect_retval;
  418. }
  419. static struct sockaddr *mock_addr = NULL;
  420. static int
  421. fake_getsockname(tor_socket_t socket, struct sockaddr *address,
  422. socklen_t *address_len)
  423. {
  424. socklen_t bytes_to_copy = 0;
  425. (void) socket;
  426. if (!mock_addr)
  427. return -1;
  428. if (mock_addr->sa_family == AF_INET) {
  429. bytes_to_copy = sizeof(struct sockaddr_in);
  430. } else if (mock_addr->sa_family == AF_INET6) {
  431. bytes_to_copy = sizeof(struct sockaddr_in6);
  432. } else {
  433. return -1;
  434. }
  435. if (*address_len < bytes_to_copy) {
  436. return -1;
  437. }
  438. memcpy(address,mock_addr,bytes_to_copy);
  439. *address_len = bytes_to_copy;
  440. return 0;
  441. }
  442. static void
  443. test_address_udp_socket_trick_whitebox(void *arg)
  444. {
  445. int hack_retval;
  446. tor_addr_t *addr_from_hack = tor_malloc_zero(sizeof(tor_addr_t));
  447. struct sockaddr_in6 *mock_addr6;
  448. struct sockaddr_in6 *ipv6_to_check =
  449. tor_malloc_zero(sizeof(struct sockaddr_in6));
  450. (void)arg;
  451. MOCK(tor_open_socket,fake_open_socket);
  452. MOCK(tor_connect_socket,pretend_to_connect);
  453. MOCK(tor_getsockname,fake_getsockname);
  454. mock_addr = tor_malloc_zero(sizeof(struct sockaddr_storage));
  455. sockaddr_in_from_string("23.32.246.118",(struct sockaddr_in *)mock_addr);
  456. hack_retval =
  457. get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
  458. AF_INET, addr_from_hack);
  459. tt_int_op(hack_retval,==,0);
  460. tt_assert(tor_addr_eq_ipv4h(addr_from_hack, 0x1720f676));
  461. /* Now, lets do an IPv6 case. */
  462. memset(mock_addr,0,sizeof(struct sockaddr_storage));
  463. mock_addr6 = (struct sockaddr_in6 *)mock_addr;
  464. mock_addr6->sin6_family = AF_INET6;
  465. mock_addr6->sin6_port = 0;
  466. tor_inet_pton(AF_INET6,"2001:cdba::3257:9652",&(mock_addr6->sin6_addr));
  467. hack_retval =
  468. get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
  469. AF_INET6, addr_from_hack);
  470. tt_int_op(hack_retval,==,0);
  471. tor_addr_to_sockaddr(addr_from_hack,0,(struct sockaddr *)ipv6_to_check,
  472. sizeof(struct sockaddr_in6));
  473. tt_assert(sockaddr_in6_are_equal(mock_addr6,ipv6_to_check));
  474. UNMOCK(tor_open_socket);
  475. UNMOCK(tor_connect_socket);
  476. UNMOCK(tor_getsockname);
  477. done:
  478. tor_free(ipv6_to_check);
  479. tor_free(mock_addr);
  480. tor_free(addr_from_hack);
  481. return;
  482. }
  483. static void
  484. test_address_udp_socket_trick_blackbox(void *arg)
  485. {
  486. /* We want get_interface_address6_via_udp_socket_hack() to yield
  487. * the same valid address that get_interface_address6() returns.
  488. * If the latter is unable to find a valid address, we want
  489. * _hack() to fail and return-1.
  490. *
  491. * Furthermore, we want _hack() never to crash, even if
  492. * get_interface_addresses_raw() is returning NULL.
  493. */
  494. tor_addr_t addr4;
  495. tor_addr_t addr4_to_check;
  496. tor_addr_t addr6;
  497. tor_addr_t addr6_to_check;
  498. int retval, retval_reference;
  499. (void)arg;
  500. #if 0
  501. retval_reference = get_interface_address6(LOG_DEBUG,AF_INET,&addr4);
  502. retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
  503. AF_INET,
  504. &addr4_to_check);
  505. tt_int_op(retval,==,retval_reference);
  506. tt_assert( (retval == -1 && retval_reference == -1) ||
  507. (tor_addr_compare(&addr4,&addr4_to_check,CMP_EXACT) == 0) );
  508. retval_reference = get_interface_address6(LOG_DEBUG,AF_INET6,&addr6);
  509. retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
  510. AF_INET6,
  511. &addr6_to_check);
  512. tt_int_op(retval,==,retval_reference);
  513. tt_assert( (retval == -1 && retval_reference == -1) ||
  514. (tor_addr_compare(&addr6,&addr6_to_check,CMP_EXACT) == 0) );
  515. #else
  516. /* Both of the blackbox test cases fail horribly if:
  517. * * The host has no external addreses.
  518. * * There are multiple interfaces with either AF_INET or AF_INET6.
  519. * * The last address isn't the one associated with the default route.
  520. *
  521. * The tests SHOULD be re-enabled when #12377 is fixed correctly, but till
  522. * then this fails a lot, in situations we expect failures due to knowing
  523. * about the code being broken.
  524. */
  525. (void)addr4_to_check;
  526. (void)addr6_to_check;
  527. (void)addr6;
  528. (void) retval_reference;
  529. #endif
  530. /* When family is neither AF_INET nor AF_INET6, we want _hack to
  531. * fail and return -1.
  532. */
  533. retval = get_interface_address6_via_udp_socket_hack(LOG_DEBUG,
  534. AF_INET+AF_INET6,&addr4);
  535. tt_assert(retval == -1);
  536. done:
  537. return;
  538. }
  539. static void
  540. test_address_get_if_addrs_list_internal(void *arg)
  541. {
  542. smartlist_t *results = NULL;
  543. (void)arg;
  544. results = get_interface_address_list(LOG_ERR, 1);
  545. tt_assert(results != NULL);
  546. /* When the network is down, a system might not have any non-local
  547. * non-multicast addresseses, not even internal ones.
  548. * Unit tests shouldn't fail because of this. */
  549. tt_int_op(smartlist_len(results),>=,0);
  550. tt_assert(!smartlist_contains_localhost_tor_addr(results));
  551. tt_assert(!smartlist_contains_multicast_tor_addr(results));
  552. /* The list may or may not contain internal addresses */
  553. /* Allow unit tests to pass on IPv6-only machines */
  554. if (smartlist_len(results) > 0) {
  555. tt_assert(smartlist_contains_ipv4_tor_addr(results)
  556. || smartlist_contains_ipv6_tor_addr(results));
  557. }
  558. done:
  559. free_interface_address_list(results);
  560. return;
  561. }
  562. static void
  563. test_address_get_if_addrs_list_no_internal(void *arg)
  564. {
  565. smartlist_t *results = NULL;
  566. (void)arg;
  567. results = get_interface_address_list(LOG_ERR, 0);
  568. tt_assert(results != NULL);
  569. /* Work even on systems with only internal IPv4 addresses */
  570. tt_int_op(smartlist_len(results),>=,0);
  571. tt_assert(!smartlist_contains_localhost_tor_addr(results));
  572. tt_assert(!smartlist_contains_multicast_tor_addr(results));
  573. tt_assert(!smartlist_contains_internal_tor_addr(results));
  574. /* if there are any addresses, they must be IPv4 */
  575. if (smartlist_len(results) > 0) {
  576. tt_assert(smartlist_contains_ipv4_tor_addr(results));
  577. }
  578. tt_assert(!smartlist_contains_ipv6_tor_addr(results));
  579. done:
  580. free_interface_address_list(results);
  581. return;
  582. }
  583. static void
  584. test_address_get_if_addrs6_list_internal(void *arg)
  585. {
  586. smartlist_t *results = NULL;
  587. (void)arg;
  588. results = get_interface_address6_list(LOG_ERR, AF_INET6, 1);
  589. tt_assert(results != NULL);
  590. /* Work even on systems without IPv6 interfaces */
  591. tt_int_op(smartlist_len(results),>=,0);
  592. tt_assert(!smartlist_contains_localhost_tor_addr(results));
  593. tt_assert(!smartlist_contains_multicast_tor_addr(results));
  594. /* The list may or may not contain internal addresses */
  595. /* if there are any addresses, they must be IPv6 */
  596. tt_assert(!smartlist_contains_ipv4_tor_addr(results));
  597. if (smartlist_len(results) > 0) {
  598. tt_assert(smartlist_contains_ipv6_tor_addr(results));
  599. }
  600. done:
  601. free_interface_address6_list(results);
  602. return;
  603. }
  604. static void
  605. test_address_get_if_addrs6_list_no_internal(void *arg)
  606. {
  607. smartlist_t *results = NULL;
  608. (void)arg;
  609. results = get_interface_address6_list(LOG_ERR, AF_INET6, 0);
  610. tt_assert(results != NULL);
  611. /* Work even on systems without IPv6 interfaces */
  612. tt_int_op(smartlist_len(results),>=,0);
  613. tt_assert(!smartlist_contains_localhost_tor_addr(results));
  614. tt_assert(!smartlist_contains_multicast_tor_addr(results));
  615. tt_assert(!smartlist_contains_internal_tor_addr(results));
  616. tt_assert(!smartlist_contains_ipv4_tor_addr(results));
  617. if (smartlist_len(results) > 0) {
  618. tt_assert(smartlist_contains_ipv6_tor_addr(results));
  619. }
  620. done:
  621. free_interface_address6_list(results);
  622. return;
  623. }
  624. static int called_get_interface_addresses_raw = 0;
  625. static smartlist_t *
  626. mock_get_interface_addresses_raw_fail(int severity)
  627. {
  628. (void)severity;
  629. called_get_interface_addresses_raw++;
  630. return smartlist_new();
  631. }
  632. static int called_get_interface_address6_via_udp_socket_hack = 0;
  633. static int
  634. mock_get_interface_address6_via_udp_socket_hack_fail(int severity,
  635. sa_family_t family,
  636. tor_addr_t *addr)
  637. {
  638. (void)severity;
  639. (void)family;
  640. (void)addr;
  641. called_get_interface_address6_via_udp_socket_hack++;
  642. return -1;
  643. }
  644. static void
  645. test_address_get_if_addrs_internal_fail(void *arg)
  646. {
  647. smartlist_t *results1 = NULL, *results2 = NULL;
  648. int rv = 0;
  649. uint32_t ipv4h_addr = 0;
  650. tor_addr_t ipv6_addr;
  651. memset(&ipv6_addr, 0, sizeof(tor_addr_t));
  652. (void)arg;
  653. MOCK(get_interface_addresses_raw,
  654. mock_get_interface_addresses_raw_fail);
  655. MOCK(get_interface_address6_via_udp_socket_hack,
  656. mock_get_interface_address6_via_udp_socket_hack_fail);
  657. results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 1);
  658. tt_assert(results1 != NULL);
  659. tt_int_op(smartlist_len(results1),==,0);
  660. results2 = get_interface_address_list(LOG_ERR, 1);
  661. tt_assert(results2 != NULL);
  662. tt_int_op(smartlist_len(results2),==,0);
  663. rv = get_interface_address6(LOG_ERR, AF_INET6, &ipv6_addr);
  664. tt_assert(rv == -1);
  665. rv = get_interface_address(LOG_ERR, &ipv4h_addr);
  666. tt_assert(rv == -1);
  667. done:
  668. UNMOCK(get_interface_addresses_raw);
  669. UNMOCK(get_interface_address6_via_udp_socket_hack);
  670. free_interface_address6_list(results1);
  671. free_interface_address6_list(results2);
  672. return;
  673. }
  674. static void
  675. test_address_get_if_addrs_no_internal_fail(void *arg)
  676. {
  677. smartlist_t *results1 = NULL, *results2 = NULL;
  678. (void)arg;
  679. MOCK(get_interface_addresses_raw,
  680. mock_get_interface_addresses_raw_fail);
  681. MOCK(get_interface_address6_via_udp_socket_hack,
  682. mock_get_interface_address6_via_udp_socket_hack_fail);
  683. results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 0);
  684. tt_assert(results1 != NULL);
  685. tt_int_op(smartlist_len(results1),==,0);
  686. results2 = get_interface_address_list(LOG_ERR, 0);
  687. tt_assert(results2 != NULL);
  688. tt_int_op(smartlist_len(results2),==,0);
  689. done:
  690. UNMOCK(get_interface_addresses_raw);
  691. UNMOCK(get_interface_address6_via_udp_socket_hack);
  692. free_interface_address6_list(results1);
  693. free_interface_address6_list(results2);
  694. return;
  695. }
  696. static void
  697. test_address_get_if_addrs(void *arg)
  698. {
  699. int rv;
  700. uint32_t addr_h = 0;
  701. tor_addr_t tor_addr;
  702. (void)arg;
  703. rv = get_interface_address(LOG_ERR, &addr_h);
  704. /* When the network is down, a system might not have any non-local
  705. * non-multicast IPv4 addresses, not even internal ones.
  706. * Unit tests shouldn't fail because of this. */
  707. if (rv == 0) {
  708. tor_addr_from_ipv4h(&tor_addr, addr_h);
  709. tt_assert(!tor_addr_is_loopback(&tor_addr));
  710. tt_assert(!tor_addr_is_multicast(&tor_addr));
  711. /* The address may or may not be an internal address */
  712. tt_assert(tor_addr_is_v4(&tor_addr));
  713. }
  714. done:
  715. return;
  716. }
  717. static void
  718. test_address_get_if_addrs6(void *arg)
  719. {
  720. int rv;
  721. tor_addr_t tor_addr;
  722. (void)arg;
  723. rv = get_interface_address6(LOG_ERR, AF_INET6, &tor_addr);
  724. /* Work even on systems without IPv6 interfaces */
  725. if (rv == 0) {
  726. tt_assert(!tor_addr_is_loopback(&tor_addr));
  727. tt_assert(!tor_addr_is_multicast(&tor_addr));
  728. /* The address may or may not be an internal address */
  729. tt_assert(!tor_addr_is_v4(&tor_addr));
  730. }
  731. done:
  732. return;
  733. }
  734. #define ADDRESS_TEST(name, flags) \
  735. { #name, test_address_ ## name, flags, NULL, NULL }
  736. struct testcase_t address_tests[] = {
  737. ADDRESS_TEST(udp_socket_trick_whitebox, TT_FORK),
  738. ADDRESS_TEST(udp_socket_trick_blackbox, TT_FORK),
  739. ADDRESS_TEST(get_if_addrs_list_internal, 0),
  740. ADDRESS_TEST(get_if_addrs_list_no_internal, 0),
  741. ADDRESS_TEST(get_if_addrs6_list_internal, 0),
  742. ADDRESS_TEST(get_if_addrs6_list_no_internal, 0),
  743. ADDRESS_TEST(get_if_addrs_internal_fail, 0),
  744. ADDRESS_TEST(get_if_addrs_no_internal_fail, 0),
  745. ADDRESS_TEST(get_if_addrs, 0),
  746. ADDRESS_TEST(get_if_addrs6, 0),
  747. #ifdef HAVE_IFADDRS_TO_SMARTLIST
  748. ADDRESS_TEST(get_if_addrs_ifaddrs, TT_FORK),
  749. ADDRESS_TEST(ifaddrs_to_smartlist, 0),
  750. #endif
  751. #ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
  752. ADDRESS_TEST(get_if_addrs_win32, TT_FORK),
  753. ADDRESS_TEST(ip_adapter_addresses_to_smartlist, 0),
  754. #endif
  755. #ifdef HAVE_IFCONF_TO_SMARTLIST
  756. ADDRESS_TEST(get_if_addrs_ioctl, TT_FORK),
  757. ADDRESS_TEST(ifreq_to_smartlist, 0),
  758. #endif
  759. END_OF_TESTCASES
  760. };