summaryrefslogtreecommitdiff
path: root/usr/src/lib/libresolv2/common/resolv/res_init.c
diff options
context:
space:
mode:
authorvk154806 <none@none>2005-09-29 23:26:53 -0700
committervk154806 <none@none>2005-09-29 23:26:53 -0700
commit898f87d827bdc9bc8d3c430cf4b38cfb8bc849ae (patch)
treea09fdbcc3e77022d3f147baa6be29fbc90b718b7 /usr/src/lib/libresolv2/common/resolv/res_init.c
parentc5be2cb066a6f1b57e2f6197a5ba6120ceec5c98 (diff)
downloadillumos-gate-898f87d827bdc9bc8d3c430cf4b38cfb8bc849ae.tar.gz
6248700 Memory leak in libresolv
Diffstat (limited to 'usr/src/lib/libresolv2/common/resolv/res_init.c')
-rw-r--r--usr/src/lib/libresolv2/common/resolv/res_init.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/usr/src/lib/libresolv2/common/resolv/res_init.c b/usr/src/lib/libresolv2/common/resolv/res_init.c
index 06b35591b1..f2a3ab172c 100644
--- a/usr/src/lib/libresolv2/common/resolv/res_init.c
+++ b/usr/src/lib/libresolv2/common/resolv/res_init.c
@@ -194,6 +194,9 @@ __res_vinit(res_state statp, int preinit) {
int dots;
union res_sockaddr_union u[2];
+ if (statp->_u._ext.ext != NULL)
+ res_ndestroy(statp);
+
if (!preinit) {
statp->retrans = RES_TIMEOUT;
statp->retry = RES_DFLRETRY;
@@ -201,9 +204,6 @@ __res_vinit(res_state statp, int preinit) {
statp->id = res_randomid();
}
- if ((statp->options & RES_INIT) != 0)
- res_ndestroy(statp);
-
memset(u, 0, sizeof(u));
#ifdef USELOOPBACK
u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
@@ -264,13 +264,13 @@ __res_vinit(res_state statp, int preinit) {
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("res_init: socket");
- return (-1);
+ goto freedata;
}
lifn.lifn_family = AF_UNSPEC;
lifn.lifn_flags = LIFC_EXTERNAL_SOURCE;
if (ioctl(s, SIOCGLIFNUM, (char *)&lifn) < 0) {
close(s);
- return (-1);
+ goto freedata;
}
if (lifn.lifn_count == 0) {
/*
@@ -284,14 +284,14 @@ __res_vinit(res_state statp, int preinit) {
if ((ioctl(s, SIOCGLIFNUM, (char *)&lifn) < 0) ||
(lifn.lifn_count < 1)) {
close(s);
- return (-1);
+ goto freedata;
}
buflen = lifn.lifn_count * sizeof (struct lifreq);
buf = (uchar_t *)malloc(buflen);
if (buf == NULL) {
close(s);
- return (-1);
+ goto freedata;
}
lifc.lifc_family = AF_UNSPEC;
@@ -301,7 +301,7 @@ __res_vinit(res_state statp, int preinit) {
if (ioctl(s, SIOCGLIFCONF, (char *)&lifc) < 0) {
close(s);
free(buf);
- return (-1);
+ goto freedata;
}
for (i = 0; i < lifn.lifn_count; ++i) {
@@ -313,7 +313,7 @@ __res_vinit(res_state statp, int preinit) {
if (ioctl(s, SIOCGLIFFLAGS, &lreq) < 0) {
close(s);
free(buf);
- return (-1);
+ goto freedata;
}
if ((lreq.lifr_flags & IFF_UP) &&
!(lreq.lifr_flags & IFF_NOLOCAL) &&
@@ -327,7 +327,7 @@ __res_vinit(res_state statp, int preinit) {
if (!int_up) {
close(s);
- return (-1);
+ goto freedata;
}
}
close(s);
@@ -604,6 +604,12 @@ __res_vinit(res_state statp, int preinit) {
res_setoptions(statp, cp, "env");
statp->options |= RES_INIT;
return (0);
+freedata:
+ if (statp->_u._ext.ext != NULL) {
+ free(statp->_u._ext.ext);
+ statp->_u._ext.ext = NULL;
+ }
+ return (-1);
}
static void