Date: Thu, 25 Dec 2008 11:04:44 -0800 From: Garrett Cooper <yanefbsd@gmail.com> To: Florent Thoumie <flz@FreeBSD.org> Cc: "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org> Subject: Re: svn commit: r186496 - head/usr.sbin/pkg_install/lib Message-ID: <BD17991F-D98A-4702-A110-2EBB540BDEB9@gmail.com> In-Reply-To: <200812251659.mBPGxZog018609@svn.freebsd.org> References: <200812251659.mBPGxZog018609@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Dec 25, 2008, at 8:59, Florent Thoumie <flz@FreeBSD.org> wrote: > Author: flz > Date: Thu Dec 25 16:59:35 2008 > New Revision: 186496 > URL: http://svn.freebsd.org/changeset/base/186496 > > Log: > Follow symlinks when deleting directories. > Bump PKG_INSTALL_VER to 20081225 (Merry Christmas \o/). > > PR: bin/54446 > Submitted by: Andrea Barberio <insomniac@slackware.it> > MFC after: 1 month > > Modified: > head/usr.sbin/pkg_install/lib/lib.h > head/usr.sbin/pkg_install/lib/plist.c > > Modified: head/usr.sbin/pkg_install/lib/lib.h > === > === > === > ===================================================================== > --- head/usr.sbin/pkg_install/lib/lib.h Thu Dec 25 16:44:01 > 2008 (r186495) > +++ head/usr.sbin/pkg_install/lib/lib.h Thu Dec 25 16:59:35 > 2008 (r186496) > @@ -105,7 +105,7 @@ > * Version of the package tools - increase only when some > * functionality used by bsd.port.mk is changed, added or removed > */ > -#define PKG_INSTALL_VERSION 20080708 > +#define PKG_INSTALL_VERSION 20081225 > > #define PKG_WRAPCONF_FNAME "/var/db/pkg_install.conf" > #define main(argc, argv) real_main(argc, argv) > > Modified: head/usr.sbin/pkg_install/lib/plist.c > === > === > === > ===================================================================== > --- head/usr.sbin/pkg_install/lib/plist.c Thu Dec 25 16:44:01 > 2008 (r186495) > +++ head/usr.sbin/pkg_install/lib/plist.c Thu Dec 25 16:59:35 > 2008 (r186496) > @@ -544,45 +544,92 @@ delete_package(Boolean ign_err, Boolean > int > delete_hierarchy(const char *dir, Boolean ign_err, Boolean nukedirs) > { > - char *cp1, *cp2; > + char *cp1, *cp2, *realdir; > > - cp1 = cp2 = strdup(dir); > - if (!fexists(dir)) { > + realdir = malloc(FILENAME_MAX); Should FILENAME_MAX be +1, as well as all offsets? > + if (realdir == NULL) { > + warnx("Couldn't allocate enough memory\n"); > + return (ign_err ? SUCCESS : FAIL); > + } > + > + if (issymlink(dir) && readlink(dir, realdir, FILENAME_MAX-1) == > -1) Memory leak. > > + return (ign_err ? SUCCESS : FAIL); > + > + strlcpy(realdir, dir, FILENAME_MAX); > + > + cp1 = cp2 = strdup(realdir); > + if (cp1 == NULL) { > + warnx("Couldn't allocate enough memory\n"); > + return (ign_err ? SUCCESS : FAIL); Another memory leak. > + } > + > + if (!fexists(realdir)) { > if (!ign_err) > warnx("%s '%s' doesn't exist", > - isdir(dir) ? "directory" : "file", dir); > - return !ign_err; > + isdir(realdir) ? "directory" : "file", realdir); > + free(cp1); > + free(realdir); > + return (ign_err ? SUCCESS : FAIL); > } > else if (nukedirs) { > - if (vsystem("%s -r%s %s", REMOVE_CMD, (ign_err ? "f" : ""), dir)) > - return 1; > + if (vsystem("%s -r%s %s", REMOVE_CMD, (ign_err ? "f" : ""), > realdir)) { > + free(cp1); > + free(realdir); > + return (ign_err ? SUCCESS : FAIL); > + } > } > - else if (isdir(dir) && !issymlink(dir)) { > - if (RMDIR(dir) && !ign_err) > - return 1; > + else if (isdir(realdir)) { > + if (RMDIR(realdir)) { > + free(cp1); > + free(realdir); > + return (ign_err ? SUCCESS : FAIL); > + } > } > else { > - if (REMOVE(dir, ign_err)) > - return 1; > + if (REMOVE(realdir, ign_err)) { > + free(cp1); > + free(realdir); > + return (ign_err ? SUCCESS : FAIL); > + } > } > > - if (!nukedirs) > - return 0; > + if (!nukedirs) { > + free(cp1); > + free(realdir); > + return (SUCCESS); > + } > while (cp2) { > if ((cp2 = strrchr(cp1, '/')) != NULL) > *cp2 = '\0'; > - if (!isemptydir(dir)) > - return 0; > - if (RMDIR(dir) && !ign_err) { > - if (!fexists(dir)) > - warnx("directory '%s' doesn't exist", dir); > - else > - return 1; > + if (!isemptydir(realdir)) { > + free(cp1); > + free(realdir); > + return (SUCCESS); > + } > + if (RMDIR(realdir) && !ign_err) { > + if (!fexists(realdir)) { > + warnx("directory '%s' doesn't exist", realdir); > + free(cp1); > + free(realdir); > + return (SUCCESS); > + } else { > + free(cp1); > + free(realdir); > + return (FAIL); > + } > } > /* back up the pathname one component */ > if (cp2) { > - cp1 = strdup(dir); > + free(cp1); > + cp1 = strdup(realdir); > + if (cp1 == NULL) { > + warnx("Couldn't allocate enough memory\n"); Another memory leak. > + return (ign_err ? SUCCESS : FAIL); > + } > } > } > - return 0; > + free(cp1); > + free(realdir); > + return (SUCCESS); > } > +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BD17991F-D98A-4702-A110-2EBB540BDEB9>