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;
}