bin/112673: [patch] pkg_add -S leaks the temp dir

John E. Hein jhein at timing.com
Mon May 14 23:40:05 UTC 2007


>Number:         112673
>Category:       bin
>Synopsis:       [patch] pkg_add -S leaks the temp dir
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon May 14 23:40:04 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     John E. Hein
>Release:        FreeBSD 6.2-STABLE i386
>Organization:
Symmetricom, Inc.
>Environment:
System: FreeBSD gromit.timing.com 6.2-STABLE FreeBSD 6.2-STABLE #2: Wed Mar 21 09:48:47 MDT 2007 jhein at gromit.timing.com:/usr/obj/usr/src/sys/GROMIT i386


7-current has the same problem.

>Description:

pkg_add -S doesn't clean up the temp dir created by pkg_add -M.

I found this because pkg_add -p was not working because of a package
that had multiple @cwd's - and plenty of packages do have these days
due to USE_RC_SUBR.  But that's another bug for another day.

>How-To-Repeat:

ls /var/tmp/instmp.*
pkg_add -v -M pkg.tbz | pkg_add -v -S
ls /var/tmp/instmp.*

Note temp dir left uncleaned.

>Fix:

This patch works fine, but I'm not that pleased with it.  But that's
mostly because I wanted to rewrite more of pkg_* as I dug into the
code.

Rather than do that (which someone else may be undertaking
already for SoC?), I figured a simple patch would do the trick for
now.  Alternate suggestions welcome.


Index: src/usr.sbin/pkg_install/add/perform.c
===================================================================
RCS file: /base/FreeBSD-CVS/src/usr.sbin/pkg_install/add/perform.c,v
retrieving revision 1.80
diff -u -p -r1.80 perform.c
--- src/usr.sbin/pkg_install/add/perform.c	9 Mar 2006 14:49:19 -0000	1.80
+++ src/usr.sbin/pkg_install/add/perform.c	14 May 2007 23:20:15 -0000
@@ -91,6 +91,7 @@ pkg_do(char *pkg)
     if (!pkg) {
 	fgets(playpen, FILENAME_MAX, stdin);
 	playpen[strlen(playpen) - 1] = '\0'; /* pesky newline! */
+	note_playpen(playpen);
 	if (chdir(playpen) == FAIL) {
 	    warnx("pkg_add in SLAVE mode can't chdir to %s", playpen);
 	    return 1;
Index: src/usr.sbin/pkg_install/lib/lib.h
===================================================================
RCS file: /base/FreeBSD-CVS/src/usr.sbin/pkg_install/lib/lib.h,v
retrieving revision 1.60
diff -u -p -r1.60 lib.h
--- src/usr.sbin/pkg_install/lib/lib.h	28 Mar 2007 05:33:52 -0000	1.60
+++ src/usr.sbin/pkg_install/lib/lib.h	14 May 2007 23:20:15 -0000
@@ -152,6 +152,7 @@ char		*vpipe(const char *, ...);
 void		cleanup(int);
 char		*make_playpen(char *, off_t);
 char		*where_playpen(void);
+void		note_playpen(const char *);
 void		leave_playpen(void);
 off_t		min_free(const char *);
 
Index: src/usr.sbin/pkg_install/lib/pen.c
===================================================================
RCS file: /base/FreeBSD-CVS/src/usr.sbin/pkg_install/lib/pen.c,v
retrieving revision 1.42
diff -u -p -r1.42 pen.c
--- src/usr.sbin/pkg_install/lib/pen.c	28 Jul 2004 16:03:13 -0000	1.42
+++ src/usr.sbin/pkg_install/lib/pen.c	14 May 2007 23:20:15 -0000
@@ -140,6 +140,17 @@ make_playpen(char *pen, off_t sz)
     return Previous;
 }
 
+/*
+ * Just record an already created playpen, so we can clean it later.
+ */
+void
+note_playpen(const char *pen)
+{
+    if (PenLocation[0])
+	pushPen(PenLocation);
+    strcpy(PenLocation, pen);
+}
+
 /* Convenience routine for getting out of playpen */
 void
 leave_playpen()
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list