Subject: pkg_chk doesn't work due too a fmt(1) bug (was: CVS commit: src/usr.bin/fmt)
To: Christos Zoulas <christos@NetBSD.org>
From: Bernd Ernesti <netbsd@lists.veego.de>
List: tech-pkg
Date: 01/03/2006 23:22:37
On Thu, Dec 15, 2005 at 09:32:00PM +0000, Christos Zoulas wrote:
>
> Module Name: src
> Committed By: christos
> Date: Thu Dec 15 21:32:00 UTC 2005
>
> Modified Files:
> src/usr.bin/fmt: fmt.c
> Added Files:
> src/usr.bin/fmt: buffer.h
>
> Log Message:
> PR/32305: seebs: Eliminate buffer overflows and simplify code by using
> dynamically allocated buffers.
Hi,
I had strange problems with the latest fmt(1) and notice that there were
some changes lately. So I did go back to rev 1.18 of fmt.c and my problems
were gone.
'pkg_chk -a' fails to merge the old pkgchk_update-HOSTNAME.conf file, while
comparing the currently installed packages with the old ones.
The resultin pkgchk_update-HOSTNAME.conf file is only 3 bytes long and
contains 'a ' + RETURN.
I have over 400 packages installed and the pkgchk_update-HOSTNAME.conf file
is 8556 bytes long, where the size of that file doesn't matter. It is the output
from $(pkgdirs_from_installed) which causes fmt to fail in such a way.
It comes down to the following lines (line 710 and following of pkg_chk.sh,v 1.21):
tmp=$(cat $PKGCHK_UPDATE_CONF;echo $(pkgdirs_from_installed)|fmt -1)
echo $tmp | fmt -1 | ${SORT} -u > $PKGCHK_UPDATE_CONF
where pkgdirs_from_installed is the following function to get all the pathnames
of the installed packages, relative to PKGSRCDIR.
pkgdirs_from_installed()
{
${PKG_INFO} -Bqa | ${AWK} -F= '/PKGPATH=/{print $2}' | ${SORT}
}
I reduced the old pkgchk_update-HOSTNAME.conf file so it contains just one
line (package), but still got the wrong updated file. $tmp was allready corrupt
at this point. Removing the pkgdirs_from_installed part 'fixed' $tmp, but then
the whole function would not do what it should do.
Bernd