OpenCoverage

getrrsetbyname.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/openbsd-compat/getrrsetbyname.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: getrrsetbyname.c,v 1.11 2007/10/11 18:36:41 jakob Exp $ */-
2-
3/*-
4 * Copyright (c) 2001 Jakob Schlyter. All rights reserved.-
5 *-
6 * Redistribution and use in source and binary forms, with or without-
7 * modification, are permitted provided that the following conditions-
8 * are met:-
9 *-
10 * 1. Redistributions of source code must retain the above copyright-
11 * notice, this list of conditions and the following disclaimer.-
12 *-
13 * 2. Redistributions in binary form must reproduce the above copyright-
14 * notice, this list of conditions and the following disclaimer in the-
15 * documentation and/or other materials provided with the distribution.-
16 *-
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
27 */-
28-
29/*-
30 * Portions Copyright (c) 1999-2001 Internet Software Consortium.-
31 *-
32 * Permission to use, copy, modify, and distribute this software for any-
33 * purpose with or without fee is hereby granted, provided that the above-
34 * copyright notice and this permission notice appear in all copies.-
35 *-
36 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM-
37 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL-
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL-
39 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,-
40 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING-
41 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,-
42 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION-
43 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.-
44 */-
45-
46/* OPENBSD ORIGINAL: lib/libc/net/getrrsetbyname.c */-
47-
48#include "includes.h"-
49-
50#if !defined (HAVE_GETRRSETBYNAME) && !defined (HAVE_LDNS)-
51-
52#include <stdlib.h>-
53#include <string.h>-
54-
55#include <netinet/in.h>-
56#include <arpa/inet.h>-
57-
58#include "getrrsetbyname.h"-
59-
60#if defined(HAVE_DECL_H_ERRNO) && !HAVE_DECL_H_ERRNO-
61extern int h_errno;-
62#endif-
63-
64/* We don't need multithread support here */-
65#ifdef _THREAD_PRIVATE-
66# undef _THREAD_PRIVATE-
67#endif-
68#define _THREAD_PRIVATE(a,b,c) (c)-
69-
70#ifndef HAVE__RES_EXTERN-
71struct __res_state _res;-
72#endif-
73-
74/* Necessary functions and macros */-
75-
76/*-
77 * Inline versions of get/put short/long. Pointer is advanced.-
78 *-
79 * These macros demonstrate the property of C whereby it can be-
80 * portable or it can be elegant but rarely both.-
81 */-
82-
83#ifndef INT32SZ-
84# define INT32SZ 4-
85#endif-
86#ifndef INT16SZ-
87# define INT16SZ 2-
88#endif-
89-
90#ifndef GETSHORT-
91#define GETSHORT(s, cp) { \-
92 register u_char *t_cp = (u_char *)(cp); \-
93 (s) = ((u_int16_t)t_cp[0] << 8) \-
94 | ((u_int16_t)t_cp[1]) \-
95 ; \-
96 (cp) += INT16SZ; \-
97}-
98#endif-
99-
100#ifndef GETLONG-
101#define GETLONG(l, cp) { \-
102 register u_char *t_cp = (u_char *)(cp); \-
103 (l) = ((u_int32_t)t_cp[0] << 24) \-
104 | ((u_int32_t)t_cp[1] << 16) \-
105 | ((u_int32_t)t_cp[2] << 8) \-
106 | ((u_int32_t)t_cp[3]) \-
107 ; \-
108 (cp) += INT32SZ; \-
109}-
110#endif-
111-
112/*-
113 * Routines to insert/extract short/long's.-
114 */-
115-
116#ifndef HAVE__GETSHORT-
117static u_int16_t-
118_getshort(msgp)-
119 register const u_char *msgp;-
120{-
121 register u_int16_t u;-
122-
123 GETSHORT(u, msgp);-
124 return (u);-
125}-
126#elif defined(HAVE_DECL__GETSHORT) && (HAVE_DECL__GETSHORT == 0)-
127u_int16_t _getshort(register const u_char *);-
128#endif-
129-
130#ifndef HAVE__GETLONG-
131static u_int32_t-
132_getlong(msgp)-
133 register const u_char *msgp;-
134{-
135 register u_int32_t u;-
136-
137 GETLONG(u, msgp);-
138 return (u);-
139}-
140#elif defined(HAVE_DECL__GETLONG) && (HAVE_DECL__GETLONG == 0)-
141u_int32_t _getlong(register const u_char *);-
142#endif-
143-
144/* ************** */-
145-
146#define ANSWER_BUFFER_SIZE 0xffff-
147-
148struct dns_query {-
149 char *name;-
150 u_int16_t type;-
151 u_int16_t class;-
152 struct dns_query *next;-
153};-
154-
155struct dns_rr {-
156 char *name;-
157 u_int16_t type;-
158 u_int16_t class;-
159 u_int16_t ttl;-
160 u_int16_t size;-
161 void *rdata;-
162 struct dns_rr *next;-
163};-
164-
165struct dns_response {-
166 HEADER header;-
167 struct dns_query *query;-
168 struct dns_rr *answer;-
169 struct dns_rr *authority;-
170 struct dns_rr *additional;-
171};-
172-
173static struct dns_response *parse_dns_response(const u_char *, int);-
174static struct dns_query *parse_dns_qsection(const u_char *, int,-
175 const u_char **, int);-
176static struct dns_rr *parse_dns_rrsection(const u_char *, int, const u_char **,-
177 int);-
178-
179static void free_dns_query(struct dns_query *);-
180static void free_dns_rr(struct dns_rr *);-
181static void free_dns_response(struct dns_response *);-
182-
183static int count_dns_rr(struct dns_rr *, u_int16_t, u_int16_t);-
184-
185int-
186getrrsetbyname(const char *hostname, unsigned int rdclass,-
187 unsigned int rdtype, unsigned int flags,-
188 struct rrsetinfo **res)-
189{-
190 struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res);-
191 int result;-
192 struct rrsetinfo *rrset = NULL;-
193 struct dns_response *response = NULL;-
194 struct dns_rr *rr;-
195 struct rdatainfo *rdata;-
196 int length;-
197 unsigned int index_ans, index_sig;-
198 u_char answer[ANSWER_BUFFER_SIZE];-
199-
200 /* check for invalid class and type */-
201 if (rdclass > 0xffff || rdtype > 0xffff) {
rdclass > 0xffffDescription
TRUEnever evaluated
FALSEnever evaluated
rdtype > 0xffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
202 result = ERRSET_INVAL;-
203 goto fail;
never executed: goto fail;
0
204 }-
205-
206 /* don't allow queries of class or type ANY */-
207 if (rdclass == 0xff || rdtype == 0xff) {
rdclass == 0xffDescription
TRUEnever evaluated
FALSEnever evaluated
rdtype == 0xffDescription
TRUEnever evaluated
FALSEnever evaluated
0
208 result = ERRSET_INVAL;-
209 goto fail;
never executed: goto fail;
0
210 }-
211-
212 /* don't allow flags yet, unimplemented */-
213 if (flags) {
flagsDescription
TRUEnever evaluated
FALSEnever evaluated
0
214 result = ERRSET_INVAL;-
215 goto fail;
never executed: goto fail;
0
216 }-
217-
218 /* initialize resolver */-
219 if ((_resp->options & RES_INIT) == 0 && res_init() == -1) {
(_resp->option...0000001 ) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__res_init () == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
220 result = ERRSET_FAIL;-
221 goto fail;
never executed: goto fail;
0
222 }-
223-
224#ifdef DEBUG-
225 _resp->options |= RES_DEBUG;-
226#endif /* DEBUG */-
227-
228#ifdef RES_USE_DNSSEC-
229 /* turn on DNSSEC if EDNS0 is configured */-
230 if (_resp->options & RES_USE_EDNS0)
_resp->options & 0x00100000Description
TRUEnever evaluated
FALSEnever evaluated
0
231 _resp->options |= RES_USE_DNSSEC;
never executed: _resp->options |= 0x00800000 ;
0
232#endif /* RES_USE_DNSEC */-
233-
234 /* make query */-
235 length = res_query(hostname, (signed int) rdclass, (signed int) rdtype,-
236 answer, sizeof(answer));-
237 if (length < 0) {
length < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
238 switch(h_errno) {-
239 case HOST_NOT_FOUND:
never executed: case 1 :
0
240 result = ERRSET_NONAME;-
241 goto fail;
never executed: goto fail;
0
242 case NO_DATA:
never executed: case 4 :
0
243 result = ERRSET_NODATA;-
244 goto fail;
never executed: goto fail;
0
245 default:
never executed: default:
0
246 result = ERRSET_FAIL;-
247 goto fail;
never executed: goto fail;
0
248 }-
249 }-
250-
251 /* parse result */-
252 response = parse_dns_response(answer, length);-
253 if (response == NULL) {
response == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
254 result = ERRSET_FAIL;-
255 goto fail;
never executed: goto fail;
0
256 }-
257-
258 if (response->header.qdcount != 1) {
response->header.qdcount != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
259 result = ERRSET_FAIL;-
260 goto fail;
never executed: goto fail;
0
261 }-
262-
263 /* initialize rrset */-
264 rrset = calloc(1, sizeof(struct rrsetinfo));-
265 if (rrset == NULL) {
rrset == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
266 result = ERRSET_NOMEMORY;-
267 goto fail;
never executed: goto fail;
0
268 }-
269 rrset->rri_rdclass = response->query->class;-
270 rrset->rri_rdtype = response->query->type;-
271 rrset->rri_ttl = response->answer->ttl;-
272 rrset->rri_nrdatas = response->header.ancount;-
273-
274#ifdef HAVE_HEADER_AD-
275 /* check for authenticated data */-
276 if (response->header.ad == 1)
response->header.ad == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
277 rrset->rri_flags |= RRSET_VALIDATED;
never executed: rrset->rri_flags |= 1;
0
278#endif-
279-
280 /* copy name from answer section */-
281 rrset->rri_name = strdup(response->answer->name);
never executed: __retval = (char *) memcpy (__retval, response->answer->name , __len);
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...answer->name )Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)(cons...->name ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
282 if (rrset->rri_name == NULL) {
rrset->rri_name == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
283 result = ERRSET_NOMEMORY;-
284 goto fail;
never executed: goto fail;
0
285 }-
286-
287 /* count answers */-
288 rrset->rri_nrdatas = count_dns_rr(response->answer, rrset->rri_rdclass,-
289 rrset->rri_rdtype);-
290 rrset->rri_nsigs = count_dns_rr(response->answer, rrset->rri_rdclass,-
291 T_RRSIG);-
292-
293 /* allocate memory for answers */-
294 rrset->rri_rdatas = calloc(rrset->rri_nrdatas,-
295 sizeof(struct rdatainfo));-
296 if (rrset->rri_rdatas == NULL) {
rrset->rri_rda...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
297 result = ERRSET_NOMEMORY;-
298 goto fail;
never executed: goto fail;
0
299 }-
300-
301 /* allocate memory for signatures */-
302 if (rrset->rri_nsigs > 0) {
rrset->rri_nsigs > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
303 rrset->rri_sigs = calloc(rrset->rri_nsigs, sizeof(struct rdatainfo));-
304 if (rrset->rri_sigs == NULL) {
rrset->rri_sigs == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
305 result = ERRSET_NOMEMORY;-
306 goto fail;
never executed: goto fail;
0
307 }-
308 }
never executed: end of block
0
309-
310 /* copy answers & signatures */-
311 for (rr = response->answer, index_ans = 0, index_sig = 0;-
312 rr; rr = rr->next) {
rrDescription
TRUEnever evaluated
FALSEnever evaluated
0
313-
314 rdata = NULL;-
315-
316 if (rr->class == rrset->rri_rdclass &&
rr->class == r...t->rri_rdclassDescription
TRUEnever evaluated
FALSEnever evaluated
0
317 rr->type == rrset->rri_rdtype)
rr->type == rrset->rri_rdtypeDescription
TRUEnever evaluated
FALSEnever evaluated
0
318 rdata = &rrset->rri_rdatas[index_ans++];
never executed: rdata = &rrset->rri_rdatas[index_ans++];
0
319-
320 if (rr->class == rrset->rri_rdclass &&
rr->class == r...t->rri_rdclassDescription
TRUEnever evaluated
FALSEnever evaluated
0
321 rr->type == T_RRSIG)
rr->type == 46Description
TRUEnever evaluated
FALSEnever evaluated
0
322 rdata = &rrset->rri_sigs[index_sig++];
never executed: rdata = &rrset->rri_sigs[index_sig++];
0
323-
324 if (rdata) {
rdataDescription
TRUEnever evaluated
FALSEnever evaluated
0
325 rdata->rdi_length = rr->size;-
326 rdata->rdi_data = malloc(rr->size);-
327-
328 if (rdata->rdi_data == NULL) {
rdata->rdi_data == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
329 result = ERRSET_NOMEMORY;-
330 goto fail;
never executed: goto fail;
0
331 }-
332 memcpy(rdata->rdi_data, rr->rdata, rr->size);-
333 }
never executed: end of block
0
334 }
never executed: end of block
0
335 free_dns_response(response);-
336-
337 *res = rrset;-
338 return (ERRSET_SUCCESS);
never executed: return (0);
0
339-
340fail:-
341 if (rrset != NULL)
rrset != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
342 freerrset(rrset);
never executed: freerrset(rrset);
0
343 if (response != NULL)
response != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
344 free_dns_response(response);
never executed: free_dns_response(response);
0
345 return (result);
never executed: return (result);
0
346}-
347-
348void-
349freerrset(struct rrsetinfo *rrset)-
350{-
351 u_int16_t i;-
352-
353 if (rrset == NULL)
rrset == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
354 return;
never executed: return;
0
355-
356 if (rrset->rri_rdatas) {
rrset->rri_rdatasDescription
TRUEnever evaluated
FALSEnever evaluated
0
357 for (i = 0; i < rrset->rri_nrdatas; i++) {
i < rrset->rri_nrdatasDescription
TRUEnever evaluated
FALSEnever evaluated
0
358 if (rrset->rri_rdatas[i].rdi_data == NULL)
rrset->rri_rda...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
359 break;
never executed: break;
0
360 free(rrset->rri_rdatas[i].rdi_data);-
361 }
never executed: end of block
0
362 free(rrset->rri_rdatas);-
363 }
never executed: end of block
0
364-
365 if (rrset->rri_sigs) {
rrset->rri_sigsDescription
TRUEnever evaluated
FALSEnever evaluated
0
366 for (i = 0; i < rrset->rri_nsigs; i++) {
i < rrset->rri_nsigsDescription
TRUEnever evaluated
FALSEnever evaluated
0
367 if (rrset->rri_sigs[i].rdi_data == NULL)
rrset->rri_sig...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
368 break;
never executed: break;
0
369 free(rrset->rri_sigs[i].rdi_data);-
370 }
never executed: end of block
0
371 free(rrset->rri_sigs);-
372 }
never executed: end of block
0
373-
374 if (rrset->rri_name)
rrset->rri_nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
375 free(rrset->rri_name);
never executed: free(rrset->rri_name);
0
376 free(rrset);-
377}
never executed: end of block
0
378-
379/*-
380 * DNS response parsing routines-
381 */-
382static struct dns_response *-
383parse_dns_response(const u_char *answer, int size)-
384{-
385 struct dns_response *resp;-
386 const u_char *cp;-
387-
388 /* allocate memory for the response */-
389 resp = calloc(1, sizeof(*resp));-
390 if (resp == NULL)
resp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
391 return (NULL);
never executed: return ( ((void *)0) );
0
392-
393 /* initialize current pointer */-
394 cp = answer;-
395-
396 /* copy header */-
397 memcpy(&resp->header, cp, HFIXEDSZ);-
398 cp += HFIXEDSZ;-
399-
400 /* fix header byte order */-
401 resp->header.qdcount = ntohs(resp->header.qdcount);
never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8)));
never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
__builtin_constant_p (__x)Description
TRUEnever evaluated
FALSEnever evaluated
0
402 resp->header.ancount = ntohs(resp->header.ancount);
never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8)));
never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
__builtin_constant_p (__x)Description
TRUEnever evaluated
FALSEnever evaluated
0
403 resp->header.nscount = ntohs(resp->header.nscount);
never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8)));
never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
__builtin_constant_p (__x)Description
TRUEnever evaluated
FALSEnever evaluated
0
404 resp->header.arcount = ntohs(resp->header.arcount);
never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8)));
never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
__builtin_constant_p (__x)Description
TRUEnever evaluated
FALSEnever evaluated
0
405-
406 /* there must be at least one query */-
407 if (resp->header.qdcount < 1) {
resp->header.qdcount < 1Description
TRUEnever evaluated
FALSEnever evaluated
0
408 free_dns_response(resp);-
409 return (NULL);
never executed: return ( ((void *)0) );
0
410 }-
411-
412 /* parse query section */-
413 resp->query = parse_dns_qsection(answer, size, &cp,-
414 resp->header.qdcount);-
415 if (resp->header.qdcount && resp->query == NULL) {
resp->header.qdcountDescription
TRUEnever evaluated
FALSEnever evaluated
resp->query == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
416 free_dns_response(resp);-
417 return (NULL);
never executed: return ( ((void *)0) );
0
418 }-
419-
420 /* parse answer section */-
421 resp->answer = parse_dns_rrsection(answer, size, &cp,-
422 resp->header.ancount);-
423 if (resp->header.ancount && resp->answer == NULL) {
resp->header.ancountDescription
TRUEnever evaluated
FALSEnever evaluated
resp->answer == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
424 free_dns_response(resp);-
425 return (NULL);
never executed: return ( ((void *)0) );
0
426 }-
427-
428 /* parse authority section */-
429 resp->authority = parse_dns_rrsection(answer, size, &cp,-
430 resp->header.nscount);-
431 if (resp->header.nscount && resp->authority == NULL) {
resp->header.nscountDescription
TRUEnever evaluated
FALSEnever evaluated
resp->authority == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
432 free_dns_response(resp);-
433 return (NULL);
never executed: return ( ((void *)0) );
0
434 }-
435-
436 /* parse additional section */-
437 resp->additional = parse_dns_rrsection(answer, size, &cp,-
438 resp->header.arcount);-
439 if (resp->header.arcount && resp->additional == NULL) {
resp->header.arcountDescription
TRUEnever evaluated
FALSEnever evaluated
resp->addition...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
440 free_dns_response(resp);-
441 return (NULL);
never executed: return ( ((void *)0) );
0
442 }-
443-
444 return (resp);
never executed: return (resp);
0
445}-
446-
447static struct dns_query *-
448parse_dns_qsection(const u_char *answer, int size, const u_char **cp, int count)-
449{-
450 struct dns_query *head, *curr, *prev;-
451 int i, length;-
452 char name[MAXDNAME];-
453-
454 for (i = 1, head = NULL, prev = NULL; i <= count; i++, prev = curr) {
i <= countDescription
TRUEnever evaluated
FALSEnever evaluated
0
455-
456 /* allocate and initialize struct */-
457 curr = calloc(1, sizeof(struct dns_query));-
458 if (curr == NULL) {
curr == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
459 free_dns_query(head);-
460 return (NULL);
never executed: return ( ((void *)0) );
0
461 }-
462 if (head == NULL)
head == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
463 head = curr;
never executed: head = curr;
0
464 if (prev != NULL)
prev != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
465 prev->next = curr;
never executed: prev->next = curr;
0
466-
467 /* name */-
468 length = dn_expand(answer, answer + size, *cp, name,-
469 sizeof(name));-
470 if (length < 0) {
length < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
471 free_dns_query(head);-
472 return (NULL);
never executed: return ( ((void *)0) );
0
473 }-
474 curr->name = strdup(name);
never executed: __retval = (char *) memcpy (__retval, name , __len);
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( name )Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)(cons...( name ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
475 if (curr->name == NULL) {
curr->name == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
476 free_dns_query(head);-
477 return (NULL);
never executed: return ( ((void *)0) );
0
478 }-
479 *cp += length;-
480-
481 /* type */-
482 curr->type = _getshort(*cp);-
483 *cp += INT16SZ;-
484-
485 /* class */-
486 curr->class = _getshort(*cp);-
487 *cp += INT16SZ;-
488 }
never executed: end of block
0
489-
490 return (head);
never executed: return (head);
0
491}-
492-
493static struct dns_rr *-
494parse_dns_rrsection(const u_char *answer, int size, const u_char **cp,-
495 int count)-
496{-
497 struct dns_rr *head, *curr, *prev;-
498 int i, length;-
499 char name[MAXDNAME];-
500-
501 for (i = 1, head = NULL, prev = NULL; i <= count; i++, prev = curr) {
i <= countDescription
TRUEnever evaluated
FALSEnever evaluated
0
502-
503 /* allocate and initialize struct */-
504 curr = calloc(1, sizeof(struct dns_rr));-
505 if (curr == NULL) {
curr == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
506 free_dns_rr(head);-
507 return (NULL);
never executed: return ( ((void *)0) );
0
508 }-
509 if (head == NULL)
head == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
510 head = curr;
never executed: head = curr;
0
511 if (prev != NULL)
prev != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
512 prev->next = curr;
never executed: prev->next = curr;
0
513-
514 /* name */-
515 length = dn_expand(answer, answer + size, *cp, name,-
516 sizeof(name));-
517 if (length < 0) {
length < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
518 free_dns_rr(head);-
519 return (NULL);
never executed: return ( ((void *)0) );
0
520 }-
521 curr->name = strdup(name);
never executed: __retval = (char *) memcpy (__retval, name , __len);
__retval != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
((const char *... ))[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( name )Description
TRUEnever evaluated
FALSEnever evaluated
((size_t)(cons...( name ) == 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
522 if (curr->name == NULL) {
curr->name == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
523 free_dns_rr(head);-
524 return (NULL);
never executed: return ( ((void *)0) );
0
525 }-
526 *cp += length;-
527-
528 /* type */-
529 curr->type = _getshort(*cp);-
530 *cp += INT16SZ;-
531-
532 /* class */-
533 curr->class = _getshort(*cp);-
534 *cp += INT16SZ;-
535-
536 /* ttl */-
537 curr->ttl = _getlong(*cp);-
538 *cp += INT32SZ;-
539-
540 /* rdata size */-
541 curr->size = _getshort(*cp);-
542 *cp += INT16SZ;-
543-
544 /* rdata itself */-
545 curr->rdata = malloc(curr->size);-
546 if (curr->rdata == NULL) {
curr->rdata == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
547 free_dns_rr(head);-
548 return (NULL);
never executed: return ( ((void *)0) );
0
549 }-
550 memcpy(curr->rdata, *cp, curr->size);-
551 *cp += curr->size;-
552 }
never executed: end of block
0
553-
554 return (head);
never executed: return (head);
0
555}-
556-
557static void-
558free_dns_query(struct dns_query *p)-
559{-
560 if (p == NULL)
p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
561 return;
never executed: return;
0
562-
563 if (p->name)
p->nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
564 free(p->name);
never executed: free(p->name);
0
565 free_dns_query(p->next);-
566 free(p);-
567}
never executed: end of block
0
568-
569static void-
570free_dns_rr(struct dns_rr *p)-
571{-
572 if (p == NULL)
p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
573 return;
never executed: return;
0
574-
575 if (p->name)
p->nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
576 free(p->name);
never executed: free(p->name);
0
577 if (p->rdata)
p->rdataDescription
TRUEnever evaluated
FALSEnever evaluated
0
578 free(p->rdata);
never executed: free(p->rdata);
0
579 free_dns_rr(p->next);-
580 free(p);-
581}
never executed: end of block
0
582-
583static void-
584free_dns_response(struct dns_response *p)-
585{-
586 if (p == NULL)
p == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
587 return;
never executed: return;
0
588-
589 free_dns_query(p->query);-
590 free_dns_rr(p->answer);-
591 free_dns_rr(p->authority);-
592 free_dns_rr(p->additional);-
593 free(p);-
594}
never executed: end of block
0
595-
596static int-
597count_dns_rr(struct dns_rr *p, u_int16_t class, u_int16_t type)-
598{-
599 int n = 0;-
600-
601 while(p) {
pDescription
TRUEnever evaluated
FALSEnever evaluated
0
602 if (p->class == class && p->type == type)
p->class == classDescription
TRUEnever evaluated
FALSEnever evaluated
p->type == typeDescription
TRUEnever evaluated
FALSEnever evaluated
0
603 n++;
never executed: n++;
0
604 p = p->next;-
605 }
never executed: end of block
0
606-
607 return (n);
never executed: return (n);
0
608}-
609-
610#endif /* !defined (HAVE_GETRRSETBYNAME) && !defined (HAVE_LDNS) */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2