summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjakob <>2004-07-18 19:07:38 +0000
committerjakob <>2004-07-18 19:07:38 +0000
commit5bb5eccb967a45db8308ed34ca3c5a27ed3c5205 (patch)
tree3eb63e6804644e31aed0345b3ea090f89d615337 /src/lib
parentf32fd4b24aca380e452786ba0c17e1c3a1d2b780 (diff)
downloadopenbsd-5bb5eccb967a45db8308ed34ca3c5a27ed3c5205.tar.gz
openbsd-5bb5eccb967a45db8308ed34ca3c5a27ed3c5205.tar.bz2
openbsd-5bb5eccb967a45db8308ed34ca3c5a27ed3c5205.zip
fix memory leak; ok millert@ tdeval@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libc/net/getrrsetbyname.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/lib/libc/net/getrrsetbyname.c b/src/lib/libc/net/getrrsetbyname.c
index f00ac2b021..60610e4943 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.7 2003/03/07 07:34:14 itojun Exp $ */ 1/* $OpenBSD: getrrsetbyname.c,v 1.8 2004/07/18 19:07:38 jakob Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2001 Jakob Schlyter. All rights reserved. 4 * Copyright (c) 2001 Jakob Schlyter. All rights reserved.
@@ -100,7 +100,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
100 struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res); 100 struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res);
101 int result; 101 int result;
102 struct rrsetinfo *rrset = NULL; 102 struct rrsetinfo *rrset = NULL;
103 struct dns_response *response; 103 struct dns_response *response = NULL;
104 struct dns_rr *rr; 104 struct dns_rr *rr;
105 struct rdatainfo *rdata; 105 struct rdatainfo *rdata;
106 int length; 106 int length;
@@ -186,13 +186,11 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
186 rrset->rri_flags |= RRSET_VALIDATED; 186 rrset->rri_flags |= RRSET_VALIDATED;
187 187
188 /* copy name from answer section */ 188 /* copy name from answer section */
189 length = strlen(response->answer->name); 189 rrset->rri_name = strdup(response->answer->name);
190 rrset->rri_name = malloc(length + 1);
191 if (rrset->rri_name == NULL) { 190 if (rrset->rri_name == NULL) {
192 result = ERRSET_NOMEMORY; 191 result = ERRSET_NOMEMORY;
193 goto fail; 192 goto fail;
194 } 193 }
195 strlcpy(rrset->rri_name, response->answer->name, length + 1);
196 194
197 /* count answers */ 195 /* count answers */
198 rrset->rri_nrdatas = count_dns_rr(response->answer, rrset->rri_rdclass, 196 rrset->rri_nrdatas = count_dns_rr(response->answer, rrset->rri_rdclass,
@@ -240,6 +238,7 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
240 memcpy(rdata->rdi_data, rr->rdata, rr->size); 238 memcpy(rdata->rdi_data, rr->rdata, rr->size);
241 } 239 }
242 } 240 }
241 free_dns_response(response);
243 242
244 *res = rrset; 243 *res = rrset;
245 return (ERRSET_SUCCESS); 244 return (ERRSET_SUCCESS);
@@ -247,6 +246,8 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
247fail: 246fail:
248 if (rrset != NULL) 247 if (rrset != NULL)
249 freerrset(rrset); 248 freerrset(rrset);
249 if (response != NULL)
250 free_dns_response(response);
250 return (result); 251 return (result);
251} 252}
252 253