diff --git a/ChangeLog b/ChangeLog index 64949aa3fe..c481a3f837 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2004-08-13 Ulrich Drepper + * inet/netgroup.h (struct name_list): Replace name pointer with + zero-sized array. + * inet/getnetgrent_r.c: Adjust code for change in name_list + layout. Numerous strdup and free calls removed. + * elf/sprof.c (read_symbols): When comparing aliases, prefer non-hidden over hidden symbols and strong over weak symbols if both don't start with '_'. diff --git a/inet/getnetgrent_r.c b/inet/getnetgrent_r.c index 5531844d14..fa355b210e 100644 --- a/inet/getnetgrent_r.c +++ b/inet/getnetgrent_r.c @@ -78,7 +78,6 @@ free_memory (struct __netgrent *data) { struct name_list *tmp = data->known_groups; data->known_groups = data->known_groups->next; - free ((void *) tmp->name); free (tmp); } @@ -86,7 +85,6 @@ free_memory (struct __netgrent *data) { struct name_list *tmp = data->needed_groups; data->needed_groups = data->needed_groups->next; - free ((void *) tmp->name); free (tmp); } } @@ -116,17 +114,18 @@ __internal_setnetgrent_reuse (const char *group, struct __netgrent *datap, } /* Add the current group to the list of known groups. */ - new_elem = (struct name_list *) malloc (sizeof (struct name_list)); - if (new_elem == NULL || (new_elem->name = __strdup (group)) == NULL) + size_t group_len = strlen (group) + 1; + new_elem = (struct name_list *) malloc (sizeof (struct name_list) + + group_len); + if (new_elem == NULL) { - if (new_elem != NULL) - free (new_elem); *errnop = errno; status = NSS_STATUS_TRYAGAIN; } else { new_elem->next = datap->known_groups; + memcpy (new_elem->name, group, group_len); datap->known_groups = new_elem; } @@ -269,18 +268,16 @@ internal_getnetgrent_r (char **hostp, char **userp, char **domainp, /* Really ignore. */ continue; - namep = (struct name_list *) malloc (sizeof (struct name_list)); - if (namep == NULL - || (namep->name = __strdup (datap->val.group)) == NULL) - { - /* We are out of memory. */ - if (namep != NULL) - free (namep); - status = NSS_STATUS_RETURN; - } + size_t group_len = strlen (datap->val.group) + 1; + namep = (struct name_list *) malloc (sizeof (struct name_list) + + group_len); + if (namep == NULL) + /* We are out of memory. */ + status = NSS_STATUS_RETURN; else { namep->next = datap->needed_groups; + memcpy (namep->name, datap->val.group, group_len); datap->needed_groups = namep; /* And get the next entry. */ continue; @@ -383,20 +380,19 @@ innetgr (const char *netgroup, const char *host, const char *user, if (namep == NULL && strcmp (netgroup, entry.val.group) != 0) { + size_t group_len = strlen (entry.val.group) + 1; namep = - (struct name_list *) malloc (sizeof (*namep)); - if (namep == NULL - || ((namep->name = __strdup (entry.val.group)) - == NULL)) + (struct name_list *) malloc (sizeof (*namep) + + group_len); + if (namep == NULL) { /* Out of memory, simply return. */ - if (namep != NULL) - free (namep); result = -1; break; } namep->next = needed; + memcpy (namep->name, entry.val.group, group_len); needed = namep; } } @@ -454,14 +450,12 @@ innetgr (const char *netgroup, const char *host, const char *user, { struct name_list *tmp = known; known = known->next; - free ((void *) tmp->name); free (tmp); } while (needed != NULL) { struct name_list *tmp = needed; needed = needed->next; - free ((void *) tmp->name); free (tmp); } diff --git a/inet/netgroup.h b/inet/netgroup.h index 90a8d450f7..aea52188d9 100644 --- a/inet/netgroup.h +++ b/inet/netgroup.h @@ -1,5 +1,5 @@ /* Internal header for netgroup related functions. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,8 +24,8 @@ track which netgroups were read and which still have to be read. */ struct name_list { - const char *name; struct name_list *next; + char name[0]; };