This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 2/3] Fix incomplete transition to supporting IS_IN_nscd/USE_NSCD which causes leaking memory.
- From: Debabrata Banerjee <dbanerje at akamai dot com>
- To: libc-alpha at sourceware dot org, Carlos O'Donell <carlos at redhat dot com>
- Cc: Debabrata Banerjee <dbanerje at akamai dot com>
- Date: Thu, 31 Oct 2013 21:10:12 -0400
- Subject: [PATCH 2/3] Fix incomplete transition to supporting IS_IN_nscd/USE_NSCD which causes leaking memory.
- Authentication-results: sourceware.org; auth=none
- References: <524E4504 dot 6050603 at redhat dot com> <1383268213-14349-1-git-send-email-dbanerje at akamai dot com>
Changelog:
2013-10-04 Debabrata Banerjee <dbanerje@akamai.com>
[BZ #16001]
* sysdeps/unix/sysv/linux/check_pf.c (make_request): Fix usecount
handling with nscd defines
Signed-off-by: Debabrata Banerjee <dbanerje@akamai.com>
---
sysdeps/unix/sysv/linux/check_pf.c | 31 +++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c
index 5dd7650..3f436b3 100644
--- a/sysdeps/unix/sysv/linux/check_pf.c
+++ b/sysdeps/unix/sysv/linux/check_pf.c
@@ -310,20 +310,15 @@ make_request (int fd, pid_t pid)
}
while (! done);
- struct cached_data *result;
- if (seen_ipv6 && in6ailist != NULL)
+ if (seen_ipv6)
+ {
+ if (result == NULL && in6ailist != NULL)
{
result = malloc (sizeof (*result)
+ in6ailistlen * sizeof (struct in6addrinfo));
if (result == NULL)
goto out_fail;
- result->timestamp = get_nl_timestamp ();
- result->usecnt = 2;
- result->seen_ipv4 = seen_ipv4;
- result->seen_ipv6 = true;
- result->in6ailen = in6ailistlen;
-
do
{
result->in6ai[--in6ailistlen] = in6ailist->info;
@@ -331,9 +326,29 @@ make_request (int fd, pid_t pid)
}
while (in6ailist != NULL);
}
+
+#ifdef IS_IN_nscd
+ result->timestamp = nl_timestamp;
+ result->usecnt = 2;
+#elif defined(USE_NSCD)
+ result->timestamp = __nscd_get_nl_timestamp ();
+ result->usecnt = 2;
+#else
+ result->usecnt = 1;
+#endif
+ result->seen_ipv4 = seen_ipv4;
+ result->seen_ipv6 = true;
+ result->in6ailen = in6ailistlen;
+ }
else
{
+ if (result)
+ free (result);
+#if defined(IS_IN_nscd) || defined(USE_NSCD)
atomic_add (&noai6ai_cached.usecnt, 2);
+#else
+ atomic_add (&noai6ai_cached.usecnt, 1);
+#endif
noai6ai_cached.seen_ipv4 = seen_ipv4;
noai6ai_cached.seen_ipv6 = seen_ipv6;
result = &noai6ai_cached;
--
1.8.3.4