diff options
author | jakob <> | 2004-07-18 19:07:38 +0000 |
---|---|---|
committer | jakob <> | 2004-07-18 19:07:38 +0000 |
commit | 5bb5eccb967a45db8308ed34ca3c5a27ed3c5205 (patch) | |
tree | 3eb63e6804644e31aed0345b3ea090f89d615337 /src/lib | |
parent | f32fd4b24aca380e452786ba0c17e1c3a1d2b780 (diff) | |
download | openbsd-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.c | 11 |
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, | |||
247 | fail: | 246 | fail: |
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 | ||