On Dec 25, 2008, at 8:59, Florent Thoumie <f...@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 <insomn...@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);
}
+
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to