--- rdist-6.1.5/src/client.c.links Wed Feb 17 17:46:09 1999 +++ rdist-6.1.5/src/client.c Wed Feb 17 17:51:15 1999 @@ -309,6 +309,18 @@ return(0); } +void freelinkinfo(lp) + struct linkbuf *lp; +{ + if (lp->pathname) + free(lp->pathname); + if (lp->src) + free(lp->src); + if (lp->target) + free(lp->target); + free(lp); +} + /* * Save and retrieve hard link info */ @@ -317,6 +329,7 @@ { struct linkbuf *lp; + /* xxx: linear search doesn't scale with many links */ for (lp = ihead; lp != NULL; lp = lp->nextp) if (lp->inum == statp->st_ino && lp->devnum == statp->st_dev) { lp->count--; @@ -329,12 +342,14 @@ lp->inum = statp->st_ino; lp->devnum = statp->st_dev; lp->count = statp->st_nlink - 1; - (void) strcpy(lp->pathname, target); - (void) strcpy(lp->src, source); + lp->pathname = strdup(target); + lp->src = strdup(source); if (Tdest) - (void) strcpy(lp->target, Tdest); + lp->target = strdup(Tdest); else - *lp->target = CNULL; + lp->target = NULL; + if (!lp->pathname || !lp->src || !(Tdest && lp->target)) + fatalerr("Cannot malloc memory in linkinfo."); return((struct linkbuf *) NULL); } --- rdist-6.1.5/src/docmd.c.links Wed Feb 17 17:51:23 1999 +++ rdist-6.1.5/src/docmd.c Wed Feb 17 17:52:44 1999 @@ -586,7 +586,7 @@ if (!nflag) { register struct linkbuf *nextl, *l; - for (l = ihead; l != NULL; free((char *)l), l = nextl) { + for (l = ihead; l != NULL; freelinkinfo(l), l = nextl) { nextl = l->nextp; if (contimedout || IS_ON(opts, DO_IGNLNKS) || l->count == 0) --- rdist-6.1.5/include/defs.h.links Wed Feb 17 17:52:58 1999 +++ rdist-6.1.5/include/defs.h Wed Feb 17 17:53:47 1999 @@ -276,9 +276,9 @@ ino_t inum; dev_t devnum; int count; - char pathname[BUFSIZ]; - char src[BUFSIZ]; - char target[BUFSIZ]; + char *pathname; + char *src; + char *target; struct linkbuf *nextp; };