diff options
author | ho <> | 2001-08-16 18:16:43 +0000 |
---|---|---|
committer | ho <> | 2001-08-16 18:16:43 +0000 |
commit | e10739e398e90eb9571c5443549981197f816e93 (patch) | |
tree | e33df12ab17c1d427664d7cc63eb2ead963335cc | |
parent | 17b2b4ae4a5f18948d5042343abdf044fe91a105 (diff) | |
download | openbsd-e10739e398e90eb9571c5443549981197f816e93.tar.gz openbsd-e10739e398e90eb9571c5443549981197f816e93.tar.bz2 openbsd-e10739e398e90eb9571c5443549981197f816e93.zip |
Use calloc() to allocate response data. Be more careful when freeing
memory. jakob@ ok.
-rw-r--r-- | src/lib/libc/net/getrrsetbyname.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/lib/libc/net/getrrsetbyname.c b/src/lib/libc/net/getrrsetbyname.c index bc4b88bbbd..87ae8fc229 100644 --- a/src/lib/libc/net/getrrsetbyname.c +++ b/src/lib/libc/net/getrrsetbyname.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: getrrsetbyname.c,v 1.3 2001/08/07 10:16:00 deraadt Exp $ */ | 1 | /* $OpenBSD: getrrsetbyname.c,v 1.4 2001/08/16 18:16:43 ho Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2001 Jakob Schlyter. All rights reserved. | 4 | * Copyright (c) 2001 Jakob Schlyter. All rights reserved. |
@@ -253,20 +253,26 @@ freerrset(struct rrsetinfo *rrset) | |||
253 | if (rrset == NULL) | 253 | if (rrset == NULL) |
254 | return; | 254 | return; |
255 | 255 | ||
256 | for (i = 0; i < rrset->rri_nrdatas; i++) { | 256 | if (rrset->rri_rdatas) { |
257 | if (rrset->rri_rdatas[i].rdi_data == NULL) | 257 | for (i = 0; i < rrset->rri_nrdatas; i++) { |
258 | break; | 258 | if (rrset->rri_rdatas[i].rdi_data == NULL) |
259 | free(rrset->rri_rdatas[i].rdi_data); | 259 | break; |
260 | free(rrset->rri_rdatas[i].rdi_data); | ||
261 | } | ||
262 | free(rrset->rri_rdatas); | ||
260 | } | 263 | } |
261 | free(rrset->rri_rdatas); | ||
262 | 264 | ||
263 | for (i = 0; i < rrset->rri_nsigs; i++) { | 265 | if (rrset->rri_sigs) { |
264 | if (rrset->rri_sigs[i].rdi_data == NULL) | 266 | for (i = 0; i < rrset->rri_nsigs; i++) { |
265 | break; | 267 | if (rrset->rri_sigs[i].rdi_data == NULL) |
266 | free(rrset->rri_sigs[i].rdi_data); | 268 | break; |
269 | free(rrset->rri_sigs[i].rdi_data); | ||
270 | } | ||
271 | free(rrset->rri_sigs); | ||
267 | } | 272 | } |
268 | free(rrset->rri_sigs); | 273 | |
269 | free(rrset->rri_name); | 274 | if (rrset->rri_name) |
275 | free(rrset->rri_name); | ||
270 | free(rrset); | 276 | free(rrset); |
271 | } | 277 | } |
272 | 278 | ||
@@ -280,7 +286,7 @@ parse_dns_response(const char *answer, int size) | |||
280 | const char *cp; | 286 | const char *cp; |
281 | 287 | ||
282 | /* allocate memory for the response */ | 288 | /* allocate memory for the response */ |
283 | resp = malloc(sizeof(*resp)); | 289 | resp = calloc(1, sizeof(*resp)); |
284 | if (resp == NULL) | 290 | if (resp == NULL) |
285 | return (NULL); | 291 | return (NULL); |
286 | 292 | ||
@@ -453,7 +459,8 @@ free_dns_query(struct dns_query *p) | |||
453 | if (p == NULL) | 459 | if (p == NULL) |
454 | return; | 460 | return; |
455 | 461 | ||
456 | free(p->name); | 462 | if (p->name) |
463 | free(p->name); | ||
457 | free_dns_query(p->next); | 464 | free_dns_query(p->next); |
458 | free(p); | 465 | free(p); |
459 | } | 466 | } |
@@ -464,8 +471,10 @@ free_dns_rr(struct dns_rr *p) | |||
464 | if (p == NULL) | 471 | if (p == NULL) |
465 | return; | 472 | return; |
466 | 473 | ||
467 | free(p->name); | 474 | if (p->name) |
468 | free(p->rdata); | 475 | free(p->name); |
476 | if (p->rdata) | ||
477 | free(p->rdata); | ||
469 | free_dns_rr(p->next); | 478 | free_dns_rr(p->next); |
470 | free(p); | 479 | free(p); |
471 | } | 480 | } |