Module Name:    src
Committed By:   christos
Date:           Thu Mar  8 20:37:29 UTC 2012

Modified Files:
        src/external/gpl2/xcvs/dist/src: acl.c

Log Message:
fix malloc botches in the original code


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/external/gpl2/xcvs/dist/src/acl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl2/xcvs/dist/src/acl.c
diff -u src/external/gpl2/xcvs/dist/src/acl.c:1.1 src/external/gpl2/xcvs/dist/src/acl.c:1.2
--- src/external/gpl2/xcvs/dist/src/acl.c:1.1	Thu Mar  8 15:32:31 2012
+++ src/external/gpl2/xcvs/dist/src/acl.c	Thu Mar  8 15:37:29 2012
@@ -32,8 +32,6 @@
 #include "getline.h"
 #include <grp.h>
 
-#define free(x) (void)(x)
-
 static int acl_fileproc (void *callerdat, struct file_info *finfo);
 
 static Dtype acl_dirproc (void *callerdat, const char *dir, const char *repos,
@@ -488,7 +486,7 @@ get_perms (const char *part_perms)
     /* no defined acl, no default acl in access file,
      * or no access file at all */
     if (part_perms == NULL) {
-    if (cvs_acl_default_permissions)
+	if (cvs_acl_default_permissions)
 	{
 	    aclconfig_default_used = 1;
 	    if (debug) fprintf (stderr, "default %s\n",
@@ -515,10 +513,12 @@ check_default:
 	usr = strtok (founduser, "!\t");
 	per = strtok (NULL, ",\t");
 
+	free(xperms);
 	xperms = xstrdup (per);
 	xperms_len = strlen (xperms);
 
 	userfound = 1;
+	free (founduser);
     }
     else
     {
@@ -548,6 +548,7 @@ check_default:
 			xrealloc_and_strcat (&xperms, &xperms_len, gperm);
 
 			groupfound = 1;
+			free (grp);
 		    }
 		}
 	    }
@@ -566,19 +567,23 @@ check_default:
 
 		while ((read = getline (&line, &line_allocated, groupfp)) >= 0)
 		{
+		    char *user;
 		    if (line[0] == '#' || line[0] == '\0' || line[0] == '\n')
 			continue;
 		    
 		    if (line[read - 1] == '\n')
 			line[--read] = '\0';
 
-		    if (grp = findusername (part_perms,
-					    findgroupname (line, username)))
+		    if ((grp = findgroupname (line, username)) &&
+			(user = findusername (part_perms, grp)))
+					    
 		    {
-			gperm = strtok (grp, "!\t");
+			gperm = strtok (user, "!\t");
 			gperm = strtok (NULL, ",\t");
 			xrealloc_and_strcat (&xperms, &xperms_len, gperm);
 			groupfound = 1;
+			free (grp);
+			free (user);
 		    }
 		}
 		
@@ -607,8 +612,6 @@ check_default:
 	    xperms_len = strlen (xperms);
 	}
 	
-	free(foundall);
-
 	/* You don't free pointers from strtok()! */
 	//free(usr);
 	//free(per);
@@ -819,7 +822,7 @@ racl_proc (int argc, char **argv, char *
     char *myargv[2];
     int err = 0;
     int which;
-    char *repository = NULL;
+    char *repository;
     char *where;
     char *obj;
     size_t objlen = 0;
@@ -832,11 +835,10 @@ racl_proc (int argc, char **argv, char *
 
     if (is_racl)
     {
+	char *v;
 	repository = Xasprintf ("%s/%s", current_parsed_root->directory,
 				argv[0]);
-	where = xmalloc (strlen (argv[0]) + (mfile == NULL ? 0 :
-			 strlen (mfile) + 1) + 1);
-	(void) strcpy (where, argv[0]);
+	where = xstrdup (argv[0]);
 
 	/* if mfile isn't null, we need to set up to do only part of the
 	 * module */
@@ -850,10 +852,12 @@ racl_proc (int argc, char **argv, char *
 	    if ((cp = strrchr (mfile, '/')) != NULL)
 	    {
 		*cp = '\0';
-		(void) strcat (repository, "/");
-		(void) strcat (repository, mfile);
-		(void) strcat (where, "/");
-		(void) strcat (where, mfile);
+		v = Xasprintf ("%s/%s", repository, mfile);
+		free (repository);
+		repository = v;
+		v = Xasprintf ("%s/%s", where, mfile);
+		free(where);
+		where = v;
 		mfile = cp + 1;
 	    }
 
@@ -862,18 +866,20 @@ racl_proc (int argc, char **argv, char *
 	    if (isdir (path))
 	    {
 		/* directory means repository gets the dir tacked on */
-		(void) strcpy (repository, path);
-		(void) strcat (where, "/");
-		(void) strcat (where, mfile);
+		free(repository);
+		repository = path;
+		v = Xasprintf ("%s/%s", where, mfile);
+		free(where);
+		where = v;
 	    }
 	    else
 	    {
+		free (path);
 		myargv[0] = argv[0];
 		myargv[1] = mfile;
 		argc = 2;
 		argv = myargv;
 	    }
-	    free (path);
 	}
 
 	/* cd to the starting repository */
@@ -901,6 +907,7 @@ racl_proc (int argc, char **argv, char *
     else
     {
 	where = NULL;
+	repository = NULL;
 	which = W_LOCAL | W_REPOS | W_ATTIC;
 
 	obj = xstrdup (argv[1]);
@@ -918,14 +925,16 @@ racl_proc (int argc, char **argv, char *
     if (listacl)
 	err = start_recursion (acllist_fileproc, NULL, acllist_dirproc, NULL,
 			       NULL, argc - 1, argv + 1, local, which, 0, 0,
-			       (char *) where, 1, repository);
+			       where, 1, repository);
     else
 	err = start_recursion (acl_fileproc, NULL, acl_dirproc, NULL, NULL,
 			       argc - 1, argv + 1, local, which, 0, 0,
-			       (char *) where, 1, repository);
+			       where, 1, repository);
 
     if (repository != NULL)
 	free (repository);
+    if (where != NULL)
+	free (where);
     
     return err;
 }
@@ -1312,7 +1321,7 @@ given_perms_valid (const char *cperms)
 char *
 make_perms (char *perms, char *founduserpart, char **xerrmsg)
 {
-    char *fperms;
+    char *fperms = NULL;
     size_t perms_len;
     size_t fperms_len;
     
@@ -1321,15 +1330,15 @@ make_perms (char *perms, char *founduser
     char *errmsg = NULL;
     
     char *retperms;
-    size_t retperms_len = 1;
-
-    retperms = xmalloc (retperms_len);
-    retperms[0] = '\0';
+    size_t retperms_len;
 
     perms_len = strlen (perms);
-
     if (perms[0] == '+' || perms[0] == '-')
     {
+	retperms = xmalloc (retperms_len);
+	retperms[0] = '\0';
+	retperms_len = 1;
+
 	if (founduserpart)
 	{
 	    char *tempfperms;
@@ -1482,9 +1491,8 @@ make_perms (char *perms, char *founduser
 			    }
 			}
 
-			fperms = xstrdup (tempfperms);
+			fperms = tempfperms;
 			fperms_len = strlen (fperms);
-			free (tempfperms);
 
 			if (!per && !err && (perms[0] == '-')) {
 			    err = 1;
@@ -1544,9 +1552,8 @@ make_perms (char *perms, char *founduser
 			    }
 			}
 
-			fperms = xstrdup (tempfperms);
+			fperms = tempfperms;
 			fperms_len = strlen (fperms);
-			free (tempfperms);
 
 			if (!per && !err && (perms[0] == '-'))
 			{
@@ -1608,9 +1615,8 @@ make_perms (char *perms, char *founduser
 			    }
 			}
 
-			fperms = xstrdup (tempfperms);
+			fperms = tempfperms;
 			fperms_len = strlen (fperms);
-			free (tempfperms);
 
 			if (!per && !err && (perms[0] == '-')) {
 			    err = 1;
@@ -1671,9 +1677,8 @@ make_perms (char *perms, char *founduser
 			    }
 			}
 
-			fperms = xstrdup (tempfperms);
+			fperms = tempfperms;
 			fperms_len = strlen (fperms);
-			free (tempfperms);
 			
 			if (!per && !err && (perms[0] == '-')) {
 				err = 1;
@@ -1709,6 +1714,10 @@ make_perms (char *perms, char *founduser
     {
 	retperms = xstrdup (perms);
     }
+    if (fperms)
+	free (fperms);
+    if (err && retperms)
+	free (retperms);
     
     return (err ? NULL : retperms);
 }
@@ -2116,6 +2125,8 @@ char *findusername (const char *string1,
 	    if (strncmp (tmp2, string2, strlen (string2)) == 0 &&
 				     tmp2[strlen (string2)] == '!')
 	    {
+		tmp2 = xstrdup (tmp2);
+		free (tmp1);
 		return tmp2;
 	    }
 	    tmp2 = strtok (NULL, ",\t");
@@ -2123,7 +2134,6 @@ char *findusername (const char *string1,
 	while (tmp2 != NULL);
 
 	free (tmp1);
-	free (tmp2);
 	
 	return NULL;
     }
@@ -2148,12 +2158,13 @@ char *findgroupname (const char *string1
 	{
 	    if (strcmp (tmp2, string2) == 0)
 	    {
+		grpname = xstrdup (grpname);
+		free (tmp1);
 		return grpname;
 	    }
 	}
 	
 	free (tmp1);
-	free (tmp2);
 	
 	return NULL;
     }

Reply via email to