Changeset 1122:d4371b7aa0ff in freeDiameter for libfdproto
- Timestamp:
- May 14, 2013, 7:01:31 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- libfdproto
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdproto/dictionary_functions.c
r1093 r1122 74 74 AddressType = 1;/* see http://www.iana.org/assignments/address-family-numbers/ */ 75 75 size = 6; /* 2 for AddressType + 4 for data */ 76 #ifdef ADDRESS_AVP_INCLUDE_PORT 77 if (sin->sin_port != 0) 78 size += 2; 79 #endif /* ADDRESS_AVP_INCLUDE_PORT */ 76 80 77 81 CHECK_MALLOC( buf = malloc(size) ); … … 79 83 /* may not work because of alignment: *(uint32_t *)(buf+2) = htonl(sin->sin_addr.s_addr); */ 80 84 memcpy(buf + 2, &sin->sin_addr.s_addr, 4); 85 86 #ifdef ADDRESS_AVP_INCLUDE_PORT 87 if (sin->sin_port != 0) 88 memcpy(buf + 6, &sin->sin_port, 2); 89 #endif /* ADDRESS_AVP_INCLUDE_PORT */ 81 90 } 82 91 break; … … 89 98 AddressType = 2;/* see http://www.iana.org/assignments/address-family-numbers/ */ 90 99 size = 18; /* 2 for AddressType + 16 for data */ 100 #ifdef ADDRESS_AVP_INCLUDE_PORT 101 if (sin6->sin6_port != 0) 102 size += 2; 103 #endif /* ADDRESS_AVP_INCLUDE_PORT */ 91 104 92 105 CHECK_MALLOC( buf = malloc(size) ); … … 94 107 /* The order is already good here */ 95 108 memcpy(buf + 2, &sin6->sin6_addr.s6_addr, 16); 109 110 #ifdef ADDRESS_AVP_INCLUDE_PORT 111 if (sin6->sin6_port != 0) 112 memcpy(buf + 18, &sin6->sin6_port, 2); 113 #endif /* ADDRESS_AVP_INCLUDE_PORT */ 96 114 } 97 115 break; … … 126 144 sSA4 * sin = (sSA4 *)interpreted; 127 145 128 CHECK_PARAMS( avp_value->os.len == 6 );146 CHECK_PARAMS( avp_value->os.len >= 6 ); 129 147 130 148 sin->sin_family = AF_INET; 131 149 /* sin->sin_addr.s_addr = ntohl( * (uint32_t *) buf); -- may not work because of bad alignment */ 132 150 memcpy(&sin->sin_addr.s_addr, buf, 4); 151 152 if (avp_value->os.len == 8) 153 memcpy(&sin->sin_port, buf + 4, 2); 133 154 } 134 155 break; … … 138 159 sSA6 * sin6 = (sSA6 *)interpreted; 139 160 140 CHECK_PARAMS( avp_value->os.len == 18 );161 CHECK_PARAMS( avp_value->os.len >= 18 ); 141 162 142 163 sin6->sin6_family = AF_INET6; 143 164 memcpy(&sin6->sin6_addr.s6_addr, buf, 16); 165 166 if (avp_value->os.len == 20) 167 memcpy(&sin6->sin6_port, buf + 16, 2); 168 144 169 } 145 170 break; … … 179 204 /* IP */ 180 205 s.sa.sa_family = AF_INET; 181 if ( avp_value->os.len != 6) {206 if ((avp_value->os.len != 6) && (avp_value->os.len != 8)) { 182 207 CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP length: %zd]", avp_value->os.len), return NULL); 183 208 return *buf; 184 209 } 185 210 memcpy(&s.sin.sin_addr.s_addr, avp_value->os.data + 2, 4); 211 if (avp_value->os.len == 8) 212 memcpy(&s.sin.sin_port, avp_value->os.data + 6, 2); 186 213 break; 187 214 case 2: 188 215 /* IP6 */ 189 216 s.sa.sa_family = AF_INET6; 190 if ( avp_value->os.len != 18) {217 if ((avp_value->os.len != 18) && (avp_value->os.len != 20)) { 191 218 CHECK_MALLOC_DO( fd_dump_extend(FD_DUMP_STD_PARAMS, "[invalid IP6 length: %zd]", avp_value->os.len), return NULL); 192 219 return *buf; 193 220 } 194 221 memcpy(&s.sin6.sin6_addr.s6_addr, avp_value->os.data + 2, 16); 222 if (avp_value->os.len == 20) 223 memcpy(&s.sin6.sin6_port, avp_value->os.data + 18, 2); 195 224 break; 196 225 default: … … 199 228 } 200 229 201 return fd_sa_dump _node(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST);230 return fd_sa_dump(FD_DUMP_STD_PARAMS, &s.sa, NI_NUMERICHOST); 202 231 } 203 232 -
libfdproto/utils.c
r1119 r1122 36 36 #include "fdproto-internal.h" 37 37 38 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump _node, sSA * sa, int flags)38 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump, sSA * sa, int flags) 39 39 { 40 40 char addrbuf[INET6_ADDRSTRLEN]; 41 char servbuf[32]; 42 int rc; 41 43 FD_DUMP_HANDLE_OFFSET(); 42 44 45 servbuf[0] = 0; 46 43 47 if (sa) { 44 int rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), NULL, 0, flags); 48 if (sSAport(sa)) { 49 rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), servbuf, sizeof(servbuf), flags); 50 } else { 51 rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), NULL, 0, flags); 52 } 45 53 if (rc) { 46 54 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", gai_strerror(rc)), return NULL); 47 55 } else { 48 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", &addrbuf[0]), return NULL); 49 } 50 } else { 51 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(NULL / ANY)"), return NULL); 52 } 53 54 return *buf; 55 } 56 57 DECLARE_FD_DUMP_PROTOTYPE(fd_sa_dump_node_serv, sSA * sa, int flags) 58 { 59 char addrbuf[INET6_ADDRSTRLEN]; 60 char servbuf[32]; 61 FD_DUMP_HANDLE_OFFSET(); 62 63 if (sa) { 64 int rc = getnameinfo(sa, sSAlen( sa ), addrbuf, sizeof(addrbuf), servbuf, sizeof(servbuf), flags); 65 if (rc) { 66 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", gai_strerror(rc)), return NULL); 67 } else { 68 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s(%s)", &addrbuf[0], &servbuf[0]), return NULL); 56 if (servbuf[0]) { 57 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s(%s)", &addrbuf[0], &servbuf[0]), return NULL); 58 } else { 59 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%s", &addrbuf[0]), return NULL); 60 } 69 61 } 70 62 } else {
Note: See TracChangeset
for help on using the changeset viewer.