On Thu, Jun 06, 2019 at 12:37:13AM +0200, Christian Weisgerber wrote: > Christian Weisgerber: > > > > To reproduce: > > > > > > mkdir -p /tmp/test /tmp/plop > > > openrsync -rx /tmp/test/ /tmp/plop/ > > > > > > Result: > > > > > > openrsync(3470) in free(): bogus pointer (double free?) 0x7f7ffffdcdc8 > > > Abort trap (core dumped) > > > > > > The patch below fixes it and simplifies the logic: > > > > I agree. However, the (re)allocation of xdev also looks bogus. > >
Hi, I noticed the realloc issue also and wanted to send a separate patch later for it. Nice it is addressed also :) > > How about this? > > > > (Also, the realloc idiom is exactly the one the man page warns > > against. Do we care here?) > > Well, let's not set a bad example. > > Index: flist.c > =================================================================== > RCS file: /cvs/src/usr.bin/rsync/flist.c,v > retrieving revision 1.27 > diff -u -p -r1.27 flist.c > --- flist.c 2 Jun 2019 14:29:58 -0000 1.27 > +++ flist.c 5 Jun 2019 22:36:28 -0000 > @@ -808,7 +808,7 @@ flist_gen_dirent(struct sess *sess, char > FTSENT *ent; > struct flist *f; > size_t flsz = 0, stripdir; > - dev_t *xdev; > + dev_t *newxdev, *xdev = NULL; > struct stat st; > > cargv[0] = root; > @@ -931,7 +931,8 @@ flist_gen_dirent(struct sess *sess, char > !S_ISDIR(ent->fts_statp->st_mode)) > continue; > > - if ((xdev = malloc(sizeof(dev_t))) == NULL) { > + if (xdev == NULL && > + (xdev = malloc(sizeof(dev_t))) == NULL) { > ERRX1("malloc"); > goto out; > } > @@ -945,12 +946,14 @@ flist_gen_dirent(struct sess *sess, char > if (flag) > continue; > > - if (nxdev) > - if ((xdev = realloc(xdev, sizeof(dev_t))) == > - NULL) { > + if (nxdev) { > + if ((newxdev = reallocarray(xdev, nxdev + 1, > + sizeof(dev_t))) == NULL) { Also could the first malloc and realloc maybe get simplified to reallocarray(NULL, ...) ? > ERRX1("realloc"); > goto out; > } > + xdev = newxdev; > + } > xdev[nxdev] = ent->fts_statp->st_dev; > nxdev++; > } > @@ -1008,8 +1011,7 @@ flist_gen_dirent(struct sess *sess, char > rc = 1; > out: > fts_close(fts); > - if (sess->opts->one_file_system) > - free(xdev); > + free(xdev); > return rc; > } > > -- > Christian "naddy" Weisgerber na...@mips.inka.de > -- Kind regards, Hiltjo