Deleted Added
full compact
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 ---