[BusyBox] [PATCH] __getgrent.c is broken if GR_SCALE_DYNAMIC is defined

Jim Treadway jim at stardot-tech.com
Fri Apr 12 23:02:04 UTC 2002


The internal __getgrent function doesn't allocate enough memory to hold 
the trailing NULL pointer in the gr_mem member of the returned 'struct 
group *'.

The following patch fixes the problem; unfortunately it is against the
older, pre-uClibc version in the uClinux-coldfire distribution, but I
think it will patch fairly painlessly since this file has been largely
unchanged.

As far as I can tell this problem exists in uClibc CVS, busybox.stable, 
and busybox CVS.

Jim


diff -u -r1.1.1.2 __getgrent.c
--- ./lib/libc/getent/__getgrent.c	22 Feb 2002 08:09:26 -0000	1.1.1.2
+++ ./lib/libc/getent/__getgrent.c	13 Apr 2002 04:31:03 -0000
@@ -44,7 +44,7 @@
   static struct group group;
   char * ptr;
   char * field_begin;
-  short member_num;
+  int member_num;
   char * endptr;
   int line_len;
 
@@ -142,25 +142,17 @@
       members[member_num+1]=NULL;
     }
 #else /* !GR_SCALE_DYNAMIC */
-  if (members!=NULL)
-    free (members);
-  members=(char **) malloc(1*sizeof(char *));
-  while ((ptr=strchr(ptr, ','))!=NULL)
-    {
-      *ptr='\0';
-      ptr++;
-      members[member_num]=field_begin;
-      field_begin=ptr;
-      member_num++;
-      members=(char **)realloc((void *)members, (member_num+1)*sizeof(char *));
-    }
-  if (*field_begin=='\0')
-      members[member_num]=NULL;
-  else
-    {
-      members[member_num]=field_begin;
-      members[member_num+1]=NULL;
-    }
+  if (members != NULL)
+	  free(members);
+  members = (char **) malloc((member_num + 1) * sizeof(char *));
+  for ( ; field_begin && *field_begin != '\0'; field_begin = ptr) {
+  	  if ((ptr = strchr(field_begin, ',')) != NULL)
+		  *ptr++ = '\0';
+	  members[member_num++] = field_begin;
+	  members = (char **) realloc(members,
+				      (member_num + 1) * sizeof(char *));
+  }
+  members[member_num] = NULL;
 #endif /* GR_SCALE_DYNAMIC */
 
   group.gr_mem=members;




More information about the busybox mailing list