Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <sys/types.h> #include <sys/socket.h> #include <net/if_dl.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <darwintest.h> T_DECL(link_ntoa_basic, "link_ntoa converts to proper string") { // u_char sdl_len; /* Total length of sockaddr */ // u_char sdl_family; /* AF_LINK */ // u_short sdl_index; /* if != 0, system given index for interface */ // u_char sdl_type; /* interface type */ // u_char sdl_nlen; /* interface name length, no trailing 0 reqd. */ // u_char sdl_alen; /* link level address length */ // u_char sdl_slen; /* link layer selector length */ // char sdl_data[12]; /* minimum work area, can be larger; // contains both if name and ll address */ struct sockaddr_dl sad; bzero(&sad, sizeof(sad)); sad.sdl_nlen = 3; sad.sdl_len = 0; sad.sdl_data[0] = 'l'; sad.sdl_data[1] = 'e'; sad.sdl_data[2] = '0'; sad.sdl_data[3] = 0x01; sad.sdl_data[4] = 0x80; sad.sdl_data[5] = 0xc2; sad.sdl_data[6] = 0x00; sad.sdl_data[7] = 0x00; sad.sdl_data[8] = 0x02; sad.sdl_data[9] = 0xaa; sad.sdl_data[10] = 0xbb; sad.sdl_data[11] = 0xcc; sad.sdl_alen = 6; char *foo = link_ntoa(&sad); T_EXPECT_EQ_STR("le0:1.80.c2.0.0.2", foo, NULL); } T_DECL(link_ntoa_overflow, "link_ntoa try to overflow") { char sockraw[64]; struct sockaddr_dl *sad; sad = (struct sockaddr_dl *)&sockraw; bzero(sad, sizeof(*sad)); sad->sdl_nlen = 3; sad->sdl_len = 0; sad->sdl_data[0] = 'l'; sad->sdl_data[1] = 'e'; sad->sdl_data[2] = '0'; sad->sdl_data[3] = 0x11; sad->sdl_data[4] = 0x80; sad->sdl_data[5] = 0xc2; sad->sdl_data[6] = 0x11; sad->sdl_data[7] = 0x11; sad->sdl_data[8] = 0xa2; sad->sdl_data[9] = 0xaa; sad->sdl_data[10] = 0xbb; sad->sdl_data[11] = 0xcc; sockraw[20] = 0xdd; sockraw[21] = 0xee; sockraw[22] = 0xff; sockraw[23] = 0x1a; sockraw[24] = 0x1b; sockraw[25] = 0x1c; sockraw[26] = 0x1d; sockraw[27] = 0x1e; sockraw[28] = 0x1f; sockraw[29] = 0x2a; sockraw[30] = 0x2b; sockraw[31] = 0x2c; /* set the length to something that will fit in the buffer */ sad->sdl_alen = 20; char *foo = link_ntoa(sad); char over = foo[64]; char over2 = foo[65]; /* this string should be 66 bytes long and exceed the buffer */ sad->sdl_alen = 21; foo = link_ntoa(sad); T_EXPECT_EQ_STR("", foo, NULL); T_EXPECT_EQ(over, foo[64], "did not overflow"); T_EXPECT_EQ(over2, foo[65], "did not overflow either"); } T_DECL(inet_ntop, "inet_ntop") { char *addresses4[] = { "1.2.3.4", "10.0.0.1", "2.2.2.2" }; char *addresses6[] = { "2001:db8:85a3::8a2e:370:7334", "::1", "::" }; for (int i = 0; i < sizeof(addresses4)/sizeof(addresses4[0]); i++){ struct in_addr addr4; char buf[64]; T_EXPECT_EQ(inet_pton(AF_INET, addresses4[i], &addr4), 1, "inet_pton(AF_INET, %s)", addresses4[i]); char *str = inet_ntop(AF_INET, &addr4, buf, sizeof(buf)); T_EXPECT_NOTNULL(str, "inet_ntop(AF_INET) of %s", addresses4[i]); T_EXPECT_EQ_STR(str, addresses4[i], "round-trip of %s", addresses4[i]); } for (int i = 0; i < sizeof(addresses6)/sizeof(addresses6[0]); i++){ struct in6_addr addr6; char buf[64]; T_EXPECT_EQ(inet_pton(AF_INET6, addresses6[i], &addr6), 1, "inet_pton(AF_INET6, %s)", addresses6[i]); char *str = inet_ntop(AF_INET6, &addr6, buf, sizeof(buf)); T_EXPECT_NOTNULL(str, "inet_ntop(AF_INET) of %s", addresses6[i]); T_EXPECT_EQ_STR(str, addresses6[i], "round-trip of %s", addresses6[i]); } } |