Don't free non-malloced memory and fix memory leak

This commit is contained in:
Ulrich Drepper 2011-05-31 08:45:44 -04:00
parent 356f8bc660
commit c8fc0c9169
2 changed files with 17 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2011-05-31 Andreas Schwab <schwab@redhat.com>
* nscd/nscd_getserv_r.c (nscd_getserv_r): Don't free non-malloced
memory. Use alloca_account. Fix memory leak when retrying.
2011-05-31 Ulrich Drepper <drepper@gmail.com> 2011-05-31 Ulrich Drepper <drepper@gmail.com>
* version.h (RELEASE): Bump for 2.14 release. * version.h (RELEASE): Bump for 2.14 release.

View File

@ -124,6 +124,7 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto,
s_name = (char *) (&found->data[0].servdata + 1); s_name = (char *) (&found->data[0].servdata + 1);
serv_resp = found->data[0].servdata; serv_resp = found->data[0].servdata;
s_proto = s_name + serv_resp.s_name_len; s_proto = s_name + serv_resp.s_name_len;
alloca_aliases_len = 1;
aliases_len = (uint32_t *) (s_proto + serv_resp.s_proto_len); aliases_len = (uint32_t *) (s_proto + serv_resp.s_proto_len);
aliases_list = ((char *) aliases_len aliases_list = ((char *) aliases_len
+ serv_resp.s_aliases_cnt * sizeof (uint32_t)); + serv_resp.s_aliases_cnt * sizeof (uint32_t));
@ -154,7 +155,9 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto,
+ (serv_resp.s_aliases_cnt + (serv_resp.s_aliases_cnt
* sizeof (uint32_t))); * sizeof (uint32_t)));
if (alloca_aliases_len) if (alloca_aliases_len)
tmp = __alloca (serv_resp.s_aliases_cnt * sizeof (uint32_t)); tmp = alloca_account (serv_resp.s_aliases_cnt
* sizeof (uint32_t),
alloca_used);
else else
{ {
tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t)); tmp = malloc (serv_resp.s_aliases_cnt * sizeof (uint32_t));
@ -249,8 +252,9 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto,
+ (serv_resp.s_aliases_cnt + (serv_resp.s_aliases_cnt
* sizeof (uint32_t))); * sizeof (uint32_t)));
if (alloca_aliases_len) if (alloca_aliases_len)
aliases_len = alloca (serv_resp.s_aliases_cnt aliases_len = alloca_account (serv_resp.s_aliases_cnt
* sizeof (uint32_t)); * sizeof (uint32_t),
alloca_used);
else else
{ {
aliases_len = malloc (serv_resp.s_aliases_cnt aliases_len = malloc (serv_resp.s_aliases_cnt
@ -368,7 +372,11 @@ nscd_getserv_r (const char *crit, size_t critlen, const char *proto,
} }
if (retval != -1) if (retval != -1)
goto retry; {
if (!alloca_aliases_len)
free (aliases_len);
goto retry;
}
} }
if (!alloca_aliases_len) if (!alloca_aliases_len)