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