Changeset 1122:d4371b7aa0ff in freeDiameter for libfdproto/dictionary_functions.c
- Timestamp:
- May 14, 2013, 7:01:31 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 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
Note: See TracChangeset
for help on using the changeset viewer.