about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--inet/getnetgrent_r.c40
-rw-r--r--inet/netgroup.h4
3 files changed, 24 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 64949aa3fe..c481a3f837 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2004-08-13  Ulrich Drepper  <drepper@redhat.com>
 
+	* 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];
 };