sm_resolve.c (98121) | sm_resolve.c (98841) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. | 2 * Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers. |
3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 */ 10 --- 30 unchanged lines hidden (view full) --- 41 * SUCH DAMAGE. 42 */ 43 44#include <sendmail.h> 45#if DNSMAP 46# if NAMED_BIND 47# include "sm_resolve.h" 48 | 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 */ 10 --- 30 unchanged lines hidden (view full) --- 41 * SUCH DAMAGE. 42 */ 43 44#include <sendmail.h> 45#if DNSMAP 46# if NAMED_BIND 47# include "sm_resolve.h" 48 |
49SM_RCSID("$Id: sm_resolve.c,v 8.24 2001/09/11 04:05:16 gshapiro Exp $") | 49SM_RCSID("$Id: sm_resolve.c,v 8.24.4.6 2002/06/25 04:22:41 ca Exp $") |
50 51static struct stot 52{ 53 const char *st_name; 54 int st_type; 55} stot[] = 56{ 57# if NETINET --- 117 unchanged lines hidden (view full) --- 175 r = (DNS_REPLY_T *) xalloc(sizeof(*r)); 176 memset(r, 0, sizeof(*r)); 177 if (r == NULL) 178 return NULL; 179 180 p = data; 181 182 /* doesn't work on Crays? */ | 50 51static struct stot 52{ 53 const char *st_name; 54 int st_type; 55} stot[] = 56{ 57# if NETINET --- 117 unchanged lines hidden (view full) --- 175 r = (DNS_REPLY_T *) xalloc(sizeof(*r)); 176 memset(r, 0, sizeof(*r)); 177 if (r == NULL) 178 return NULL; 179 180 p = data; 181 182 /* doesn't work on Crays? */ |
183 memcpy(&r->dns_r_h, p, sizeof(HEADER)); 184 p += sizeof(HEADER); | 183 memcpy(&r->dns_r_h, p, sizeof(r->dns_r_h)); 184 p += sizeof(r->dns_r_h); |
185 status = dn_expand(data, data + len, p, host, sizeof host); 186 if (status < 0) 187 { 188 dns_free_data(r); 189 return NULL; 190 } 191 r->dns_r_q.dns_q_domain = sm_strdup(host); 192 if (r->dns_r_q.dns_q_domain == NULL) 193 { 194 dns_free_data(r); 195 return NULL; 196 } 197 p += status; 198 GETSHORT(r->dns_r_q.dns_q_type, p); 199 GETSHORT(r->dns_r_q.dns_q_class, p); 200 rr = &r->dns_r_head; 201 while (p < data + len) 202 { | 185 status = dn_expand(data, data + len, p, host, sizeof host); 186 if (status < 0) 187 { 188 dns_free_data(r); 189 return NULL; 190 } 191 r->dns_r_q.dns_q_domain = sm_strdup(host); 192 if (r->dns_r_q.dns_q_domain == NULL) 193 { 194 dns_free_data(r); 195 return NULL; 196 } 197 p += status; 198 GETSHORT(r->dns_r_q.dns_q_type, p); 199 GETSHORT(r->dns_r_q.dns_q_class, p); 200 rr = &r->dns_r_head; 201 while (p < data + len) 202 { |
203 int type, class, ttl, size; | 203 int type, class, ttl, size, txtlen; |
204 205 status = dn_expand(data, data + len, p, host, sizeof host); 206 if (status < 0) 207 { 208 dns_free_data(r); 209 return NULL; 210 } 211 p += status; 212 GETSHORT(type, p); 213 GETSHORT(class, p); 214 GETLONG(ttl, p); 215 GETSHORT(size, p); | 204 205 status = dn_expand(data, data + len, p, host, sizeof host); 206 if (status < 0) 207 { 208 dns_free_data(r); 209 return NULL; 210 } 211 p += status; 212 GETSHORT(type, p); 213 GETSHORT(class, p); 214 GETLONG(ttl, p); 215 GETSHORT(size, p); |
216 *rr = (RESOURCE_RECORD_T *) xalloc(sizeof(RESOURCE_RECORD_T)); | 216 if (p + size > data + len) 217 { 218 /* 219 ** announced size of data exceeds length of 220 ** data paket: someone is cheating. 221 */ 222 223 if (LogLevel > 5) 224 sm_syslog(LOG_WARNING, NOQID, 225 "ERROR: DNS RDLENGTH=%d > data len=%d", 226 size, len - (p - data)); 227 dns_free_data(r); 228 return NULL; 229 } 230 *rr = (RESOURCE_RECORD_T *) xalloc(sizeof(**rr)); |
217 if (*rr == NULL) 218 { 219 dns_free_data(r); 220 return NULL; 221 } 222 (*rr)->rr_domain = sm_strdup(host); 223 if ((*rr)->rr_domain == NULL) 224 { --- 30 unchanged lines hidden (view full) --- 255 sizeof host); 256 if (status < 0) 257 { 258 dns_free_data(r); 259 return NULL; 260 } 261 l = strlen(host) + 1; 262 (*rr)->rr_u.rr_mx = (MX_RECORD_T *) | 231 if (*rr == NULL) 232 { 233 dns_free_data(r); 234 return NULL; 235 } 236 (*rr)->rr_domain = sm_strdup(host); 237 if ((*rr)->rr_domain == NULL) 238 { --- 30 unchanged lines hidden (view full) --- 269 sizeof host); 270 if (status < 0) 271 { 272 dns_free_data(r); 273 return NULL; 274 } 275 l = strlen(host) + 1; 276 (*rr)->rr_u.rr_mx = (MX_RECORD_T *) |
263 xalloc(sizeof(MX_RECORD_T) + l); | 277 xalloc(sizeof(*((*rr)->rr_u.rr_mx)) + l); |
264 if ((*rr)->rr_u.rr_mx == NULL) 265 { 266 dns_free_data(r); 267 return NULL; 268 } 269 (*rr)->rr_u.rr_mx->mx_r_preference = (p[0] << 8) | p[1]; 270 (void) sm_strlcpy((*rr)->rr_u.rr_mx->mx_r_domain, 271 host, l); --- 4 unchanged lines hidden (view full) --- 276 sizeof host); 277 if (status < 0) 278 { 279 dns_free_data(r); 280 return NULL; 281 } 282 l = strlen(host) + 1; 283 (*rr)->rr_u.rr_srv = (SRV_RECORDT_T*) | 278 if ((*rr)->rr_u.rr_mx == NULL) 279 { 280 dns_free_data(r); 281 return NULL; 282 } 283 (*rr)->rr_u.rr_mx->mx_r_preference = (p[0] << 8) | p[1]; 284 (void) sm_strlcpy((*rr)->rr_u.rr_mx->mx_r_domain, 285 host, l); --- 4 unchanged lines hidden (view full) --- 290 sizeof host); 291 if (status < 0) 292 { 293 dns_free_data(r); 294 return NULL; 295 } 296 l = strlen(host) + 1; 297 (*rr)->rr_u.rr_srv = (SRV_RECORDT_T*) |
284 xalloc(sizeof(SRV_RECORDT_T) + l); | 298 xalloc(sizeof(*((*rr)->rr_u.rr_srv)) + l); |
285 if ((*rr)->rr_u.rr_srv == NULL) 286 { 287 dns_free_data(r); 288 return NULL; 289 } 290 (*rr)->rr_u.rr_srv->srv_r_priority = (p[0] << 8) | p[1]; 291 (*rr)->rr_u.rr_srv->srv_r_weight = (p[2] << 8) | p[3]; 292 (*rr)->rr_u.rr_srv->srv_r_port = (p[4] << 8) | p[5]; 293 (void) sm_strlcpy((*rr)->rr_u.rr_srv->srv_r_target, 294 host, l); 295 break; 296 297 case T_TXT: | 299 if ((*rr)->rr_u.rr_srv == NULL) 300 { 301 dns_free_data(r); 302 return NULL; 303 } 304 (*rr)->rr_u.rr_srv->srv_r_priority = (p[0] << 8) | p[1]; 305 (*rr)->rr_u.rr_srv->srv_r_weight = (p[2] << 8) | p[3]; 306 (*rr)->rr_u.rr_srv->srv_r_port = (p[4] << 8) | p[5]; 307 (void) sm_strlcpy((*rr)->rr_u.rr_srv->srv_r_target, 308 host, l); 309 break; 310 311 case T_TXT: |
298 (*rr)->rr_u.rr_txt = (char *) xalloc(size + 1); | 312 313 /* 314 ** The TXT record contains the length as 315 ** leading byte, hence the value is restricted 316 ** to 255, which is less than the maximum value 317 ** of RDLENGTH (size). Nevertheless, txtlen 318 ** must be less than size because the latter 319 ** specifies the length of the entire TXT 320 ** record. 321 */ 322 323 txtlen = *p; 324 if (txtlen >= size) 325 { 326 if (LogLevel > 5) 327 sm_syslog(LOG_WARNING, NOQID, 328 "ERROR: DNS TXT record size=%d <= text len=%d", 329 size, txtlen); 330 dns_free_data(r); 331 return NULL; 332 } 333 (*rr)->rr_u.rr_txt = (char *) xalloc(txtlen + 1); |
299 if ((*rr)->rr_u.rr_txt == NULL) 300 { 301 dns_free_data(r); 302 return NULL; 303 } | 334 if ((*rr)->rr_u.rr_txt == NULL) 335 { 336 dns_free_data(r); 337 return NULL; 338 } |
304 (void) strncpy((*rr)->rr_u.rr_txt, (char*) p + 1, *p); 305 (*rr)->rr_u.rr_txt[*p] = 0; | 339 (void) sm_strlcpy((*rr)->rr_u.rr_txt, (char*) p + 1, 340 txtlen + 1); |
306 break; 307 308 default: 309 (*rr)->rr_u.rr_data = (unsigned char*) xalloc(size); 310 if (size != 0 && (*rr)->rr_u.rr_data == NULL) 311 { 312 dns_free_data(r); 313 return NULL; 314 } 315 (void) memcpy((*rr)->rr_u.rr_data, p, size); | 341 break; 342 343 default: 344 (*rr)->rr_u.rr_data = (unsigned char*) xalloc(size); 345 if (size != 0 && (*rr)->rr_u.rr_data == NULL) 346 { 347 dns_free_data(r); 348 return NULL; 349 } 350 (void) memcpy((*rr)->rr_u.rr_data, p, size); |
351 break; |
|
316 } 317 p += size; 318 rr = &(*rr)->rr_next; 319 } 320 *rr = NULL; 321 return r; 322} 323 --- 88 unchanged lines hidden --- | 352 } 353 p += size; 354 rr = &(*rr)->rr_next; 355 } 356 *rr = NULL; 357 return r; 358} 359 --- 88 unchanged lines hidden --- |