svn commit: r186496 - head/usr.sbin/pkg_install/lib
Garrett Cooper
yanefbsd at gmail.com
Thu Dec 25 19:05:21 UTC 2008
On Dec 25, 2008, at 8:59, Florent Thoumie <flz at 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 at 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);
> }
> +
More information about the svn-src-all
mailing list