misc/146947: [ports] bsd.ports.mk incorrectly using pkg-deinstall
for both deinstall and post-deinstall operations
Garrett Cooper
gcooper at FreeBSD.org
Tue May 25 06:50:02 UTC 2010
>Number: 146947
>Category: misc
>Synopsis: [ports] bsd.ports.mk incorrectly using pkg-deinstall for both deinstall and post-deinstall operations
>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: Tue May 25 06:50:01 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Garrett Cooper
>Release: 9-CURRENT
>Organization:
Cisco Systems, Inc.
>Environment:
FreeBSD bayonetta.local 9.0-CURRENT FreeBSD 9.0-CURRENT #0 r206173M: Mon Apr 26 22:45:06 PDT 2010 root at bayonetta.local:/usr/obj/usr/src/sys/BAYONETTA.ata amd64
>Description:
pkg-deinstall as specified by the ports infrastructure is being incorrectly used as both the deinstall and post-deinstall script instead of just being the deinstall script.
Example:
$ sudo make deinstall
===> Deinstalling for devel/py-ctypes
===> Deinstalling py26-ctypes-1.0.2
cd: can't cd to /usr/local/lib/python%%PYVER%%/
pkg_delete: deinstall script returned error status
cd: can't cd to /usr/local/lib/python%%PYVER%%/
pkg_delete: post-deinstall script returned error status
$ cat pkg-deinstall
#!/bin/sh
PYVER='%%PYVER%%'
set -e
cd "$PKG_PREFIX/lib/python${PYVER}/"
find -s -X . -name '*.py[co]' | xargs rm -f
find -s -X . -type d | xargs rmdir -p
The error was unintentional, but the outcome was interesting nonetheless.
The actual problem appears to be pkg_install though (note the Note: clause):
-k dscript
Set dscript to be the de-install procedure for the package. This
can be any executable program (or shell script). It will be
invoked automatically when the package is later (if ever) de-
installed. It will be passed the package's name as the first
argument.
Note: if the -K option is not given, this script will serve as
both the de-install and the post-deinstall script for the pack-
age, differentiating between the functionality by passing the
keywords DEINSTALL and POST-DEINSTALL respectively, along with
the package's name.
This behavior doesn't make sense; the deinstall script should be executed once and only once as executing these scripts twice only serves to cause confusion in the overall execution flow.
I believe that the code causing this is appears to be in delete/perform.c (in particular the second conditional block):
/*
* Test whether to use the old method of passing tokens to deinstallation
* scripts, and set appropriate variables..
*/
if (fexists(POST_DEINSTALL_FNAME)) {
new_m = 1;
post_script = POST_DEINSTALL_FNAME;
pre_arg = post_arg = "";
} else if (fexists(DEINSTALL_FNAME)) {
post_script = DEINSTALL_FNAME;
pre_arg = "DEINSTALL";
post_arg = "POST-DEINSTALL";
} else {
post_script = pre_arg = post_arg = NULL;
}
Whether or not this behavior should be deprecated is one thing, but I find it to be incredibly confusing.
>How-To-Repeat:
1. Create a package with pkg_create -k foo, like the following script:
cat > foo <<EOF
#!/bin/sh
echo "my name is \${0##*/}"; false
EOF
2. Add the package.
3. Delete the package.
The output from package delete will be:
"my name is POST-INSTALL"
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list